CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

ブラウザでAutoCADが使える!?AutoCAD Web

2023-10-22 06:36:58 | Autocad

Autodesk AutoCAD Web とは

AutoCAD Web は、建築設計者、エンジニア、建設・施工スペシャリストが利用可能な信頼できるソリューションです。AutoCAD® のコア コマンドで、簡単な編集や基本的な設計に必要な操作を行えます。魅力的な価格でさまざまな機能をご利用いただけます。AutoCAD Web(旧称 AutoCAD Web アプリ、AutoCAD Mobile アプリ)では、以下のようなことができます。 

  • 使い慣れた図ツールをオンラインのシンプルなインタフェースで使用

  • 場所を問わずに DWG™ ファイルにアクセスして更新

  • 作業現場でも、設計の共同作業をすばやく行うことができます




ガ~ン_| ̄|○ il||li
スマホのGooglecromeじゃ使えないとは!!!

しかもカスタマイズ・自動化も無理だとよ。

WebAssemblyでカスタマイズ・自動化可能だと思っていたのだが・・・
それもできんということか?

ゲーミングノートでもかなりしんどいからWebAssemblyによってブラウザでサクサク使えるようにして、さらにカスタマイズ・自動化もしたかったのに・・・

インクジェット4Dプリント

2023-09-16 07:18:02 | Autocad
平面のシートが自律的に立体物に! “折り紙”を応用した日本発の技術「インクジェット4Dプリント」の潜在力

平面のシートが自律的に立体物に! “折り紙”を応用した日本発の技術「インクジェット4Dプリント」の潜在力

温水に浸すと自律的に折り上がるシートを、東京大学大学院の研究チームが開発した。インクジェットプリンターで平面に印刷したものを変形させることで3Dプリンターを使わず...

WIRED.jp

インクジェット4Dプリント

https://wired.jp/article/inkjet-4d-print/

そう言えば折り紙CADとかいうYoutubeを見た。F#言語 AutoCADで検索したら出てきたやつ。

【C# / F#】プログラミング / 折り紙シミュレータ開発配信 【豊穣ミノリ / #豊穣配信 / VTuber】

【C# / F#】プログラミング / 折り紙シミュレータ開発配信 【豊穣ミノリ / #豊穣配信 / VTuber】

開発中の折り紙シミュレータ「Orimath」に機能を追加する様子をお届けします。専門的すぎる話はしない予定なのでプログラミングできない方も来ていただけると嬉しいです!配...

YouTube



ブラウザ(googlecrome)でAutocadを使うには?

2023-09-16 01:58:58 | Autocad

WebAssemblyが気になるので調べてみた - Qiita

WebAssemblyが気になるので調べてみた - Qiita

OpenStandiaアドベントカレンダー、今回はWebAssemblyについて取り上げます。はじめに最近「WebAssembly」というワードを耳にする機会が増えた気がします。初めてこの単…

Qiita

WebAssemblyを使えば良いらしい。

つまり、Autocadのプラグインを作るのにJavascriptが使えるようになることを意味していると思われる。

PythonでAutoCAD2020のdllを参照追加して直線を描く方法は?

2023-09-10 04:12:42 | Autocad
Pythonでautocad2020のacdbmgd.dll、accoremgd.dll、acmgd.dll、AcWindows.dllの参照追加をしてautocadで直線を描くことは可能か?可能ならば、参照追加のソースコードに続けて直線を描くソースコードを書いて。

Pythonを使用してAutoCADを操作することは可能ですが、そのためにはAutoCADの公式APIを使用する必要があります。AutoCADの公式APIはAutoCADのインストールに含まれており、通常はCOMオブジェクトとして提供されます。以下に、Pythonを使用してAutoCAD 2020で直線を描画する一般的な手順を示します。

PythonでCOMオブジェクトを操作するために、pywin32モジュールをインストールします。

pip install pywin32

Pythonスクリプト内でAutoCADのCOMオブジェクトを作成し、AutoCADを操作します。

import win32com.client

# AutoCADのCOMオブジェクトを作成
acad = win32com.client.Dispatch("AutoCAD.Application")

# AutoCADのドキュメントを取得
doc = acad.ActiveDocument

# 直線を描画する開始点と終了点を指定
start_point = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.0, 0.0, 0.0))
end_point = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (10.0, 10.0, 0.0))

# 直線を描画
line = doc.ModelSpace.AddLine(start_point, end_pointこのスクリプトでは、pywin32を使用してAutoCADのCOMオブジェクトを作成し、新しい直線をAutoCADのモデルスペースに描画しています。このコードはAutoCAD 2020に対して動作するもので、AutoCADのバージョンによって微調整が必要かもしれません。
なお、この方法でAutoCADを操作するには、AutoCADがインストールされている必要があり、COMオブジェクトとしてアクセス可能であることを確認してください。また、セキュリティやエラーハンドリングに注意することが重要です。

本当にできるんだろうな?

AutoCADでフリーハンドの線を作図する方法

2023-07-22 01:56:24 | Autocad



【操作方法】
SKETCH[スケッチ]コマンドで作図ができます。

[種類(T)]オプションで、スケッチの線を描くオブジェクトの種類を指定できます。(システム変数 SKPOLY)
[線分(L)]
[ポリライン(P)]
[スプライン(S)]

1. コマンドラインに sketch と入力し、[Enter]キーを押します。

2. スケッチを指定または[種類(T)増分値(I)許容値(L)]: でマウスの左ボタンでクリックして作図を開始します。

3. 左ボタンを押しながら、作図をするとフリーハンドの線が描けます。

だとよ。

描いた曲線をクリックすると平滑化できるプラグインを作りたくなった。

AutoCADのプラグインを作る無料マニュアルの和訳(46ページまで)

2023-06-07 19:23:37 | Autocad

プロローグ

少年の頃、私はすぐにコンピューターに魅了されました。 いわゆるコンピュータ時代はまだ始まっていませんでした。 企業はカードトレイとタイプライターを使用していました。 手紙は郵便で送られてきました。 電話での連絡、それもスマホではありませんでした。 私が初めてプログラミングを体験したのは、1985 年頃の MSX でした。今日知られているようなインターネットはまだ存在していませんでした。 MSX はテレビに接続する必要があり、コードを保存するためにカセット プレーヤーを使用するコンピューターでした。 MSXのプログラミングはBASICという言語で行われました。 これは、コンピュータに実行する簡単なコマンドを与える、かなり単純な言語でした。 私の最初の実際のアプリケーションはスロット マシンでした。 あらゆる種類のシンボルが 3 つのブロックで回転し、完全にランダムに停止します。 スリーカードを獲得するとポイントが得られます。 とてもうまくいきました。 ただし、3 つの等しいシンボルが出現する確率が小さすぎることを除いては (実際のスロット マシンでも同様ですが、それはさておき)。 幸いなことに、コード内の数式を調整できたので、3 つが等しい可能性が大幅に高まりました。 あっという間に何百万ものポイントが集まり、画面に収まりきらないほどになりました。 結局のところ、いつも勝つのだから、プレイの楽しみはすぐになくなってしまった。 遊ぶことが目的ではなく、何かを実行するコードを書くことが目的でした。 そこから何を学んだのでしょうか? コンピューターゲームは楽しいですか? いいえ、プログラミングの方がずっと好きでした。 アイデアをコードに変換して、コンピューターが何をしたいのかを理解できるようにします。 初めて PC を購入した後、すぐに他の言語に切り替えました。 BASICはPCには向いていませんでした。 より優れた言語は Pascal でした。 Pascalでたくさんのツールを作りました。 その後、他の言語や Web デザインなどのテクニックを試してみました。 コードは PHP と JavaScript で記述されました。 これらの言語はどちらも C++ と非常に似ています。 プログラミングはまだ趣味でした。 専門的にはコンピューターも扱わなければなりませんでした。 私は土地測量士になっており、事務所では AutoCAD を使って測量を地図に変換する作業を頻繁に行っていました。 私は趣味から AutoCAD を自分の希望に合わせるために AutoLISP と VBA を勉強しました。 便利なツールを使用すると、時間のかかるさまざまなアクションを突然、はるかに速く実行できるようになります。 私は常々、趣味を仕事には絶対にしたくないと言ってきました。 そうなると趣味がなくなってしまうからです。 2011年、本人の意思とは関係なくプロのプログラマーになりました。 現在は、主に土木工学市場を対象とした、AutoCAD、Civil 3D、または Map 3D 内で実行される商用アプリケーションを開発しています。 それ以来、趣味はなくなりました。 2015年になって、やっぱり痒くなり始めました。 私にとって、本を書き始めるのは長い間楽しいと思っていました。 数多くの小説やスパイ本が成功を収めた後、いよいよ本番の時が来た。 私は本を書くという新しい趣味を見つけました。 プログラミングに関する本はたくさんあります。 さて、AutoCADについて。 しかし、AutoCAD のプログラミングについては、ほとんど何も見つかりません。 自分でいろいろ調べて試してみなければなりませんでした。 こういった本があればよかったと思います。 幸いなことに、私は自分の知識をこの本にまとめて、他の人が AutoCAD のプログラミングを学習する際の助けを得ることができるようになりました。

この本の読み方

まだプログラミングの経験はそれほど必要ありませんが、プログラミングをしたいという意欲は持っています。 適度なコンピュータ知識を持ち、自立していることが期待されます。 「うまくいかない」と叫ぶ消極的なタイプの人は、この本を読まないほうがいいでしょう。 何かがうまくいかない場合はどうすればよいですか? 次に、原因を見つけて修正します。 それは精神だ! 本書はそのような人たちに向けて書かれています。 この本はかなり読みやすいです。 章の順序は、コードの一部を説明し、その後に (必要に応じて) そのコードのより詳細な説明が続き、さまざまな章の間に理論の章が含まれることもあります。 この本の進行は、AutoCAD で何かを動作させる実践に焦点を当てています。 .NET で何ができるかについては詳しく説明されていません。可能性が広すぎるためです。 コードの各部分では、.NET に慣れるために十分な関数と構造について説明します。 知識が増えれば増えるほど、まだ知らないことを自分で調べることが容易になります。 これはダミー向けの本ではないため、中間ブロック、情報ブロック、ヒントや興味深いポイントは見つかりません。 ただし、最後に用語のリストと簡単な説明があります。 これは参考になります。 また、すべてのソース コードは Web サイト Books.huiz.net/ からダウンロードできるため、すべてを再度入力する必要はありません (実際には、その方が有益です)。 この新しいエディションは、Visual Studio 2022 と AutoCAD 2023 を使用するように更新されました。また、英語が私の母国語ではないことにも留意してください。 私はオランダ語で書かれた本をできるだけ正確に翻訳しようと努めました。 ただし、言葉の間違いを見つけた場合は、読み返していただき、私の無知をご容赦いただければ幸いです。 この本が有益であり、あなたにとって 1 ユーロまたは 1 ドルの価値があると感じていただければ幸いです。 学習頑張ってください! アントン・ホイジンガ「これまでやったことがないので、できると思います。」 長くつ下のピッピ

1. プログラミングを始める方法

プログラミングを学習する最適な方法は何かについては意見が分かれています。 最善の方法はプログラミングに関する良い本を読むことだという人もいるでしょう。 そこで、プログラミングに関する一般的な本であるべきなのか、それともこれからプログラミングする言語に関する本であるべきなのかという疑問が生じます。私は、「プログラミングはあなたの中になければなりません」と言います。 そうでなければ辞めた方が良いかもしれません。 車の運転を本から学ぶことはできません。 ギアのシフトやウインカーの操作、オイルの点検方法など、車の運転の仕組みを学ぶことができます。 しかし、適切な運転能力がなければ、交通状況を洞察したり、無意識のうちに車を操作したり、他の道路利用者に予測したりする能力は得られません。 プログラミングでも同じように機能します。 コンピューターが勤務時間中にのみ電源を入れればよい単なるツールである場合、この特別なデバイスの詳細に興味がない場合、コンピューターの素晴らしい世界をさらに深く掘り下げることに興味がない場合 、それならこの本を読むのをやめて、別の趣味に集中したほうがいいでしょう。 それは決して何かになることはありません。 今後の人生も頑張ってください! この記事を読み続ければ、あなたにはプログラミングを学ぶ意欲があり、おそらくプログラミングが上手くなりたいという意欲があると思います。 じゃあ、頑張ってね! この章はいくつかの退屈なことから始まります。 うまくいけば、それを乗り越えることができます。

AutoCAD のプログラミング

この本は AutoCAD のプログラミングについて説明しています。 この本は、Windows アプリケーションやモバイル アプリケーションのプログラミングに関する詳細を網羅した本ではなく、AutoCAD 用のプラグインの作成に関する本です。 特定のプログラミング領域をさらに深く掘り下げたい場合は、それに関する本が無数にあります。 しかし、残念なことに、AutoCAD のプログラミングに関する書籍はほとんどありません。 だからこそ、他の人の助けになればと思い、時間をかけて自分で記事を書きました。

どの言語が適しているか

プログラミングに使用できる言語はいくつかありますが、実際に選択することはできません。 学ぶのに最適な言語は C# です。 これはシーシャープと発音されます。 そして、なぜこれが最良の選択なのでしょうか? AutoCAD の場合は、次の言語 (およびその他の言語) でプログラムすることができるためです。 AutoLISP VBA (Visual Basic for Applications) VB.NET C++ C# AutoLISP は非常に強力で、これを使用してほとんどあらゆるものを作成できます。 ただし、Lisp ルーチンは難読化されていないか、難読化されていないため、サードパーティによる編集が可能です。 さらに、Lisp の構文は他の一般的なプログラミング言語とはまったく異なるため、別の言語を学習したり、異なる言語間で切り替えたりすることははるかに困難です。 AutoCAD での小さなアクションに適しており、知っていれば確かに役立ちますが、とにかく脇に置いておきましょう。 VBA は非常に強力でもあり、VBA を使用すると Windows 関数も実行できるため、Lisp よりもはるかに多くのことができます。 VBA には古い言語であるという欠点があり、何年も前から消滅したと宣言されてきましたが、今も復活し続けています。 さらに、これは Visual Basic 言語であるため、本物の (またはむしろ成功した) プログラマーによって真剣に受け止められていません。 VB.NET は最新のプログラミング言語であり、C# で可能なことはすべて実行できます。 どちらも .NET のバリアントであり、これらを使用して非常に強力なアプリケーションを作成できます。 構文を除けば 2 つの言語に違いはありませんが、繰り返しになりますが、この言語は成功した (つまり、必ずしも優れているわけではない) プログラマーによって真剣に受け止められていません。 VB.NET を学びたいかどうかはあなた次第です。おそらく、VBA で何かをやったことがあり、VB.NET の方が簡単に思えるからかもしれませんが、私はまだそれをお勧めしません。 VB.NET の構文は VBA とはかなり異なるため、すぐに C# を使用することをお勧めします。 私は、VB.NET ですべてを行う成功したプログラマーを 1 人だけ知っています。 それは Autodesk の Stephen Preston です。 古い C 言語の出身である彼は、.NET が登場したときに選択を迫られました。VB.NET か C# でしょうか? 彼の友人たちは VB.NET プログラマーよりも優れていると感じていたため、スティーブンは強い頑固さから自分の意見を主張するために VB.NET を選択しました。 しかし、インタビューの中で、彼は自分の選択について少し後悔しているようです:

http://adndevblog.typepad.com/autocad/2012/05/vbnet-or-c-a-personal-perspective.html

C++ はかなり複雑な言語です。 学ぶことはできますが、始めるのにはほとんど適していません。 また、C# よりも少し強力です。 これは非常に複雑で、すぐに実際の障害を引き起こす可能性があるため、最初から始めるのには適した言語ではありません。 次に、C# は真剣に受け止められている言語であり、Java、PHP、JavaScript、C++ などの他の言語と構文が非常に似ている言語であるため、上にある別の言語の学習や理解が容易になります。 それの。 C# を読める場合は、インターネット上で JavaScript または C++ のサンプルを入手し、それを独自のコードに実装することもできます。 さらに、C# または C に似た言語には、VB.NET よりもはるかに多くのサンプル コードがあります。 C# には、非常に強力なアプリケーションを迅速かつ簡単に構築するために必要なものがすべて揃っています。 Windows アプリケーションであっても AutoCAD プラグインであっても、この言語は優れています。 したがって、プログラミングには C# が (最良の) 選択肢となります。VB.NET でもまったく同じことができるにもかかわらず、C# プログラマーはほぼすべての人からより真剣に受け止められ、また、良い仕事をより早く見つけることができます。 C# プログラマが VB.NET プログラマよりも先を行く正当な理由はありませんが、それでもそれは起こります。 出世してキャリアを築きたいですか? 次に、C# を選択します。

プログラミングはどうやって学ぶのですか?

それは難しい質問であり、人によって答えが異なる可能性があります。 どうすればプログラミングを学ばなくなるかという質問に答えるのははるかに簡単です。 それでも、誰もがプログラミングを学ぶために必要だと私が考えるいくつかのポイントについて言及します。 プログラミングに興味を持ちましょう。 やり始めてください。 いくつか試してみてください。 インターネットで調べてください。 行動することで学びが得られます。 他の人から学びましょう。 ソースコードを読んで、それが何を意味するかを理解してください。 ローレンド・アルメイダはかつてこう言いました、「一つの情報源から盗むことは盗作だ。多くの情報源から盗むことは研究だ。」 時間と機会があれば、証明書や学位を取得できるコースを受講してください。 これが必要な特定の仕事では常に役に立ちます。 協力的になりましょう。 グループの中で自分が最も優れている場合もあれば、最も劣っている場合もあります。 彼らから学びましょう。 プログラムを再構築します。 自分で解決策を見つける方法を見つけてください。 他のコンピューター言語を学びましょう。 自分でコーディング標準を計画します。 あなたを制限するのではなく、より構造化された方法で作業できるようにするためです。 言語は24時間では習得できません。 むしろ、年単位で数えてください。

.NET とは

では、.NET (ドット ネットと発音される) とは正確には何でしょうか? 聞いたことがあるかもしれませんが、そうでない場合は、簡単に説明させていただきます。 もっと詳しく知りたければ、それに関する良い本が見つかると思います。 昔は、アプリケーションを作成したい場合は、すべてを自分で解決する必要がありました。 たとえば、画面を制御する方法、キーボードを読み取る方法、マウスの動きを傍受する方法などです。 多くの場合、それを行う既製のコードやモジュールを購入できますが、デバイスごとに構成が異なるため、すべてのコンピュータで動作するアプリケーションを作成するのは常に複雑な作業でした。 メーカーはデバイスに対処する独自の方法を持っていましたが、それらは相互に互換性がありませんでした。 プログラマーとして、発生する可能性のあるすべての構成をテストすることはできず、アプリケーションがブランド X のマウスやブランド Y のモニターでは正しく動作しない可能性があります。 その後、Java が市場に登場しました。 これは、利用可能な Java 関数を使用してアプリケーションを実行できるフレームワークでした。 これにより、実際の作業を担当する関数を直接呼び出すことができるようになり、プログラミング時間が大幅に節約されました。 Microsoft は Windows に Java を実装することを許可されていなかったため、Java のアイデアに基づいて、より優れた独自のフレームワークを作成しました。 このフレームワークは .NET と呼ばれていました。 このフレームワークは、互換性のあるいくつかの言語の基礎として機能しました。 これは、.NET 言語で記述されたアプリケーションは相互に通信でき、コード内で使用できる関数ライブラリが膨大な数にあるためです。 それが .NET が成功した理由です。 C++.NET、VB.NET、F#、C# のどれを使用するかは問題ではなく、すべて互換性があります。 また、利用できる機能が豊富であることもプログラマーにとってはありがたいことです。 1 行のコードで、適切なボタンとアイコンを備えた通知ウィンドウを表示できます。 数行のコードを使用すると、パスが存在するかどうか、ファイルが上書きされるかどうかなどを個別にチェックできる保存ダイアログを呼び出すことができます。 .NET 自体は言語ではなく、さまざまな .NET 言語で使用できる機能が満載されたライブラリのコレクションです。 オートデスクは、AutoCAD の機能を利用できる .NET アプリケーションを AutoCAD にロードできるようにしました。 したがって、AutoCAD の .NET アプリケーションは、AutoCAD 関数だけでなく Windows 関数も呼び出すことができます。 オートデスクは、いわば AutoCAD の機能を満載したライブラリで .NET を拡張しました。 そのため、アプリケーションを .NET で公開する企業が増えています。 このように公開されたライブラリをAPI(アプリケーション・プログラミング・インターフェース)と呼びます。

エディタ

実際に何かを作成し始める前に言及すべきもう 1 つの重要な点は、エディタです。 これは、コードを記述する単なるエディターそのものではないため、IDE (統合開発環境) とも呼ばれます。 もちろん、メモ帳で C# を書くこともできますが、それは馬を荷車に乗せて自分で荷車を引くのと同じくらい面倒で時間がかかります。 迅速かつ簡単にプログラミングできるようにするには、選択した言語に焦点を当てたエディターを備えた IDE が必要です。 たとえばC#。 そして、このために非常に優れた IDE があります。 本書では Microsoft の Visual Studio のみを使用します。 これには無料版があり、一定の条件を満たしていればプログラミングが可能です。 営利企業に勤めていて、アプリケーションからも収入を得ている場合は、Visual Studio を購入するか、別の IDE を探す必要があります。 オープンソースの IDE もあります。 現在、Visual Studio 2022 が Microsoft の最新の IDE です。 以下のリンクから「Visual Studio 2022 Community」という無料バージョンをダウンロードできます:

https://visualstudio.microsoft.com/downloads/

Community Edition を選択します。 Visual Studio をインストールできない場合は、プログラミングを諦めることを検討するかもしれません。 成功したと仮定して、次の章でお会いしましょう。 ただし、もう 1 つヒントを教えておきます。 インストール中に、インストールするコンポーネントを指定できます。 単純な C# アプリケーションを開発することになるため、[デスクトップとモバイル] カテゴリで .NET デスクトップ開発オプションを選択するだけです。このセクションのみにチェックを入れ、提案されている右側のすべてのサブセクションを受け入れるだけで十分です。 今のところはそれで十分です。 追加のコンポーネントは後でいつでもインストールできますが、AutoCAD プラグインには必要ありません。

2. AutoCAD でのアプリケーション

この章では、AutoCAD にロードする小さなアプリケーションを作成し、AutoCAD のプログラミングの基本を説明します。 Visual Studio がインストールされており、もちろん AutoCAD もインストールされています。

プロジェクトの作成

AutoCAD のプラグインはクラス ライブラリ タイプです。 Visual Studio の起動画面で、[新しいプロジェクトの作成] を選択できます。次のステップで、[クラス ライブラリ (.NET Framework)] を選択します。 .NET Standard と .NET Core のバリアントもあるので、間違えないように注意してください。 それらを選択してはいけません! また、「カスタム コントロール ライブラリ」バリアント、「Windows フォーム」バリアント、「WPF」バリアントではなく、「クラス ライブラリ (.NET Framework)」のみが正しい選択です。

上部で

C#、Windows、ライブラリでフィルタリングしてリストを絞り込むことができます。

次のステップに進みます。 名前を入力し、プロジェクトを保存する場所を選択できます。 ここまでは特別なことは何もありませんが、先に進む前にいくつかの新しいことを学ぶ必要がある点が異なります。 作成するアプリケーションごとにプロジェクトが必要です。 プロジェクトには、すべてのプログラム コード、ダイアログで使用する画像などのリソース、さまざまな関数ライブラリへの参照、およびこのアプリケーションに適用される設定が含まれています。 すべてが一緒になってプロジェクトです。 1 つのプロジェクトが 1 つのアプリケーションにつながります。 したがって、プロジェクトはアプリケーションです。 ソリューション内に複数のプロジェクトを含めることができます。 したがって、ソリューションは、属するプロジェクトの集合です。 プロジェクトが相互に参照する場合、複数のプロジェクトを含むソリューションが確かに役立ちます。 この段階では、各プロジェクトが独自のソリューション内にあるというルールを使用します。 そしておそらく将来的には、他のことをすることは決してないだろう。 上記の場合、ソリューション名をプロジェクト名と同じにしても安全です。 ソリューションとプロジェクトを別々にし、同じディレクトリに置かないことをお勧めします。 次に、正しい .NET Framework バージョンを選択します。 これは必要に応じて後で変更できます。 必要なバージョンを知っておくと便利です。 AutoCAD のバージョンごとにこれは異なる場合があります。 リリース .NET Framework AutoCAD 2023 4.8 AutoCAD 2022 4.8 AutoCAD 2021 4.8 AutoCAD 2020 4.7 AutoCAD 2019 4.7 AutoCAD 2018 4.6 AutoCAD 2023 用のアプリケーションを作成する場合、プロジェクトは を参照する必要があります。 NET Framework 4.8 が使用されますが、AutoCAD 2018 用のものを作成する場合は、.NET Framework 4.6 を選択してください。 [作成] ボタンをクリックすると、エディターが表示され、クラス ライブラリ タイプの新しく作成されたプロジェクトが表示されます。 スクリーンショットのレイアウトはところどころ異なる場合がありますが、大部分は一致しているはずです。 コンポーネントが見つからない場合は、通常、[表示] メニューから検索して表示できます。 左側/中央の大きなフィールドは、コード ファイルを変更するエディタです。 右側にはソリューション エクスプローラーがあり、プロジェクトに属するすべてのファイルがあります。 その下には、選択したオブジェクトまたはファイルのプロパティを変更できる [プロパティ] ウィンドウがあります。 この本では、IDE の表示にライト テーマを使用しています。これはスクリーンショットに適しています。 テーマを暗いままにすることもできます。これは IDE のパフォーマンスには影響しません。

大きなコード

エディターには、開いているファイルが表示されます。 上部のタブには開いているファイルが表示され、ファイルを簡単に切り替えたり、閉じたり、並べたりすることができます。 コードは色を使用して表示されるため、コードのさまざまな部分が何を表しているのかがすぐにわかります。 コードにはいくつかの重要な機能もあります。すべて大文字と小文字が区別されます。中かっこを除くすべての行はセミコロンで終わります。コード行は中かっこでグループ化できます。これらは 1 つに属するコード ブロックです。

リファレンス ライブラリ

今のところは心配する必要はありません。結果が必要です。 まず、AutoCAD ライブラリを使用することをプロジェクトに伝える必要があります。 これを行うには、ソリューション エクスプローラーで [参照] を右クリックし、[参照の追加] オプションを選択します。 次のウィンドウで、必要な AutoCAD ライブラリを探します。 最近使用した参照がまだないため、[参照] ボタンを使用して検索する必要があります。 AutoCAD がインストールされている場所に移動し、ファイル「C:\Program Files\AutoCAD 2023\AcCoreMgd.dll」を添付します。 これには、アプリケーションから呼び出すことができる AutoCAD 関数が含まれています。 別のバージョンの AutoCAD を使用している場合は、対応するフォルダでファイルを見つけることができます。 このウィンドウの [アセンブリ] タブの [フレームワーク] セクションで次の項目も探します。

ライブラリ

「System.Windows.Forms」を選択します。 「OK」をクリックします。 エディターには新しいものは何も表示されませんが、ソリューション エクスプローラーで「参照」を開くと、選択したこれらのライブラリを見つけることができます。 デフォルトですでにリンクされているライブラリがいくつかありますが、ここでは何もする必要はありません。 必要なものもあれば、気にしないものもあります。 「AcCoreMgd」と「System.Windows.Forms」がその中にあれば、今のところは問題ありません。

Writing code 
Expand the code in the editor. By default, this was written:

using System; 
using System.Collections.Generic;
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ClassLibrary1 

    public class Class1 
    { 
    } 

Remove this and replace by this: 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
namespace ClassLibrary1 

    public class Class1 
    { 
        [Autodesk.AutoCAD.Runtime.CommandMethod("MyCommand")] 
        public void MyFirstCommand() { 

            System.Windows.Forms.MessageBox.Show("Hooray! AutoCAD is doing what I want!"); 
        } // void
    } // class 
} // namespace 

今のところ、それが何を言っているのか、それが何を意味するのかは心配しないでください。 いずれの場合も、エディターにエラーが含まれていないことが重要です。 これは、何かが間違っている場合、赤い波線で示されます。

ブラケットの位置も問題ありません。 デフォルトでは、これらは新しい行に配置されますが、左中括弧が同じ行に配置されるように設定することもできます。 エディターが上記のコードを別の方法で再配置しても、それは問題ではありません。 緑色の文字はコメント行です。 アプリケーションはこれらを無視します。コードの意味を理解することは、自分自身や他のプログラマーにとって役立ちます。 中括弧が多すぎるとどのブロックで終わるのか混乱する可能性があるため、短いコメント テキストを使用して、閉じ中括弧が void またはクラスまたは名前空間に属していることを示すことができます。 これは個人的な選択です。 上のスクリーンショットでは、コードが正しくコピーされず、エラーが検出されています。 必要に応じて、前に指定したコードをコピーします。ただし、コードにエラーがないかどうかを確認してください。エラーが発生すると機能しなくなります。 では、これを AutoCAD でどのように機能させるのでしょうか?

デバッグ

コードが正しく動作するかどうかをテストできます。 これをデバッグと呼びます。 これを実行するには、エディタで F5 をクリックするか、ツールバーの緑色のスタート ボタンを押すか、[デバッグ] > [デバッグの開始] メニューを使用します。 次のエラー メッセージが表示されます。 これは、プロジェクトの出力をすぐに開始できないことを意味します。 それは正しい。 Windows アプリケーション タイプのプロジェクトは EXE ファイルを生成し、Windows で直接開始できますが、クラス ライブラリ プロジェクトは DLL ファイルになります。 それを直接開始することはできません。 デバッグ時に何を開始するかをプロジェクトのプロパティで指定することで、この問題を修正できます。 ソリューション エクスプローラーの [プロパティ] でマウスを右クリックし、 [開く] オプションを選択します。 エディターに、プロジェクトのプロパティを含むページが表示されます。 「デバッグ」タブを選択します。

ここではデバッグ時にプロジェクトを開始するように書かれていますが、DLLファイルが実行できないため実行できません。 したがって、「外部プログラムの開始」オプションを選択します。 適切な場所でファイル「acad.exe」を見つけます。 もう一度「F5」をクリックします。 すべてがうまくいけば、AutoCAD が起動します。 しかし、新しく作成したアプリケーションは機能するのでしょうか? これを正しく理解するには、自分が今何をしたかを知ることが重要です。 これは段階的な計画で表すことができます。Visual Studio でプロジェクトを作成しました。 このプロジェクトは、デバッグを開始すると自動的に DLL ファイルに変換されます。 DLL ファイルは実行できないため、デバッグ時に外部アプリケーション、つまり AutoCAD を起動するように指定しました。 ただし、もちろん AutoCAD は DLL をまだ認識していないため、最初に DLL を AutoCAD にロードする必要があります。 AutoCAD が起動したら、コマンド ラインに「NETLOAD」コマンドを入力します。 ダイアログボックスが表示されます。 Visual Studio が作成した DLL ファイルを見つけます。 これは、プロジェクトの下のフォルダー「\bin\Debug\」にあります。 保存場所がわからない場合は、Visual Studio のソリューション エクスプローラーでプロジェクトを選択し、[プロパティ] ウィンドウでプロジェクトの場所を確認できます。 このテキストをコピーして AutoCAD のダイアログ ボックスに貼り付け、そこから「\bin\Debug\」に進むことができます。 私のコンピュータ上の場所とは異なる可能性があります。 それはプロジェクトを保存する場所によって異なります。 あなたの場所には、多数の DLL ファイルがあります。 ファイル「ClassLibrary1.dll」を選択し、「OK」をクリックします。 AutoCAD によってファイルがロードされるので、このセッション中にこの DLL で作成した関数にアクセスできるようになります。 AutoCAD を再起動しても、DLL は自動的に再ロードされません。 現時点では、デバッグ セッションごとにこの DLL を AutoCAD に手動でロードする必要があります。 AutoCAD にはロードされたものを一切信頼しないという冷酷な習慣があるため、おそらく次のウィンドウが表示されるでしょう。

「一度ロード」または「常にロード」オプションを選択します。 これを回避する他の方法については、この本の後半で説明します。 コードを少しでも理解していれば、AutoCAD で使用するための新しいコマンドを思いついたことがわかります。 このコマンドは「MyCommand」と呼ばれ、テキストを含むダイアログ ボックスが表示されます。 うまくいくか見てみましょう。 コマンド ラインに「MyCommand」コマンドを入力し、メッセージが表示されるかどうかを確認します。 すべてがうまくいけば、次のように表示されます。おめでとうございます。 次の章に進むことができます。 うまくいかなかった場合は、本当にプログラミングを学びたいのか、やる気があるのかを自問してください。 どうやら、あなたはこの本の指示にうまく従えないか、数行のコードをコピーして貼り付けるのが苦手のようです。 または、よく読むのはあなたの趣味ではありません。 必要に応じて、上記の説明に従って再試行してください。 それがうまくいかない場合は、あきらめてください。

3. 注: AutoCAD でのアプリケーション 前の章では、プロジェクトを作成しました。 このプロジェクトには、AutoCAD への参照とコードの一部が含まれています。 デバッグにより、これらすべてが AutoCAD にロードできる DLL ファイルに変換されました。 しかし、正確には何が起こったのでしょうか?

参照

AutoCAD 関数を使用するには、その関数が使用可能になっている必要な AutoCAD ライブラリへの参照が必要です。 Visual Studio のソリューション エクスプローラーで [参照] 見出しの下を見ると、「accoremgd」への参照が表示されます。 これは AutoCAD コア マネージドの略で、これには AutoCAD のコア機能が含まれており、マネージドはマネージド コードへの参照であることを示します。 なぜこれがコアと呼ばれるのでしょうか? オートデスクは、.NET で数千の機能を利用できるようにしました。 これらの関数はすべて、わかりやすくするためにグループに分けることができます (オブジェクトの関数は、コマンド ライン、パレット、リボンの関数、または算術関数とは別のグループにあります)。 これらすべての関数グループを 1 つの DLL に入れることはできますが、非常に大きなファイルになります。 そのため、オートデスクは関数をグループに分割するだけでなく、異なる DLL ファイルにも分割しました。 コア関数は別の DLL にあり、現在プロジェクトにリンクされています。 マネージコードとは何ですか? .NET アプリケーションはマネージド コードで構成されており、コンピューターが常に制御します。 .NET 言語では、単にコンピュータをクラッシュさせることはできません (AutoCAD はクラッシュする可能性がありますが、これはそれほど難しいことではありません)。 .NET アプリケーションでエラーが発生すると、Windows はそれをインターセプトし、エラー メッセージを表示し、破損しているものや機能しなくなったものをシャットダウンします。 アンマネージ コードはその逆で、Windows が制御しないコードです。 その際にエラーが発生すると、Windows がクラッシュしたり破損したりする可能性があります。

コードテキスト

コード自体はテキスト形式で記述されます。 これはプロジェクト内に CS ファイルとして保存されます。 CS は C# の略語です (これがどのように発音されるかについては、「プログラミングの開始」の章を参照してください)。 Windows エクスプローラーでこのファイルを検索し、テキスト エディターで開くことができます。 このファイルの先頭には、便利な関数を含む名前空間への参照 (using) があります。 これは必須ではありませんが、あると便利です。 この例では、それは必要さえありません。 using で始まる行をすべて削除しても、コードは引き続き機能します。 赤い下線は表示されず、再度デバッグしても問題は発生しません。 それで、使用とは何ですか? using はコードをより速く書くのに役立ちます。 基本的にはショートカットです。 次の行を見てください。 System.Windows.Forms.MessageBox.Show("やったー! AutoCAD は私が望むことを実行しています!"); 青い文字の MessageBox はオブジェクトです。 このオブジェクトには Show 機能があります。 実行すると、指定されたテキストを含む通知ウィンドウが表示されます。 このようなウィンドウをコード内の数十箇所に表示したい場合は、通知ウィンドウを表示するたびに System.Windows.Forms.MessageBox オブジェクトを参照する必要があります。 を使って短く書くこともできます。 MessageBox オブジェクトは、System.Windows.Forms という名前の名前空間にあります。 名前空間については、この本の後半で詳しく説明します。 ただし、using を使用してこの名前空間をコードの先頭に置くと、未知のオブジェクトに遭遇するとすぐにコード自体が正しい名前空間を探すようになります。 この行を次のように変更します。 MessageBox.Show("やったー! AutoCAD は私が望むことを実行しています!"); 次に Visual Studio で表示されるのは、テキスト MessageBox が青ではなくなり、赤い下線が付けられたことです。 マウスを上に置いたままにすると、現在のコンテキストでは MessageBox が使用できないことを示すメッセージが表示されます。 次に、最初の行の先頭に次の行を追加します。 メッセージボックスのテキストが再び青くなり、赤い線が消えることがすぐにわかります。 青い文字の CommandMethod も同様です。 これもオブジェクトですが、Show などのメソッドはありません。 これは、Autodesk.AutoCAD.Runtime という名前空間に存在します。 [Autodesk.AutoCAD.Runtime.CommandMethod("MyCommand")] という行を次のように置き換えます: [CommandMethod("MyCommand")] 赤い下線が再び表示されます。 今度は、赤下線の部分をマウスの左ボタンで 1 回クリックします。 このテキストの下の左側、または行番号の付いたバーにボタンが表示されます。 それをクリックすると、ドロップダウン メニューが表示されます。 したがって、 using を配置するか(最初のオプション)、現在の CommandMethod テキストを Autodesk.AutoCAD.Runtime.CommandMethod に置き換えるか(2 番目のオプション)を選択できます。 これはまさにあなたが望んでいないことです。なぜなら、あなたがすでに持っていたもので終わることになるからです。

最初のオプションを選択します。 Visual Studio は、新しい using を一番上に配置し、CommandMethod というテキストが再び青色になります。 完全なコードは次のようになります。

using System.Windows.Forms; 
using Autodesk.AutoCAD.Runtime; 

namespace ClassLibrary1 

    public class Class1 
    { 
        [CommandMethod("MyCommand")] 
        public void MyFirstCommand() 
        { 
            MessageBox.Show("Hooray! AutoCAD is doing what I want!"); 
        } // void 
    } // class 
} // namespace 

アプリの動作に関しては、usingを使用しても問題ありません。 むしろ、より効率的にコードを書く機会となります。

デバッグ

コードが機能するかどうかをテストすることをデバッグと呼びます。 デバッグはデバッグ プロセスの開始であり、その目的はエラー (バグ) を見つけることです。 これには、プログラミング エラーの検出だけでなく、アプリケーションの動作が期待どおりであるかどうかも含まれます。 Visual Studio に赤い下線が表示されなければ、アプリケーションは正しく動作していると思われるかもしれませんが、実際に実行してみないとわかりません。 public void MyFirstCommand() { という行を private void MyFirstCommand() { に変更しても、Visual Studio はこれで問題ありません。 これは、両方の行がコード的に正しいためです。 アプリケーションを AutoCAD にロードすると、AutoCAD はコマンドを認識せず、「不明なコマンド "MYCOMMAND"」というメッセージが表示されます。 F1 を押してヘルプを表示します。 パブリックとプライベートの違いについては、後ほど詳しく説明します。 機能するまでコードを復元すると、プライベートが再びパブリックになります。

4. 理論: Visual Studio

この章では、Visual Studio に関するいくつかの理論について説明します。 ただそれを読んで、そこに何が書かれているかを理解するように努めてください。 背景知識を知っておくと常に役に立ちます。

Visual Studio IDE

Visual Studio は、さまざまな言語のコードをアプリケーションに変換するのに役立つアプリケーションです。 この変換はコンパイルと呼ばれます。 これにより、書かれたコードがコンピュータが理解して実行できるファイルに変換されます。 Windows アプリケーション (EXE ファイル)、関数ライブラリ (DLL ファイル)、コンソール アプリケーションなど、さまざまな種類のアプリケーションを作成できます。 後者は、Windows のダイアログ ボックスを使用しないアプリケーションであり、基本的には、まだそれが何であるかを知っている人にとっては昔ながらの DOS プログラムです。 最近では、Visual Studio を使用して携帯電話用の Windows アプリやブラウザー用の Web アプリを作成することもできます。 AutoCAD にロードできるのは関数ライブラリだけであるため、本書では関数ライブラリの作成についてのみ説明します。 IDE はコードを記述する部分です。 IDE は、さまざまな部分に色を使用したり、エラーを早期に検出して表示したりすることで、作成を支援します。 また、IDE には、適切な関数と適切なパラメーターを見つけるのに役立つ IntelliSense と呼ばれる優れた機能が含まれています。


AutoCADのプラグインを作る無料マニュアル

2023-06-05 23:46:30 | Autocad



Start Programming in .NET for AutoCAD (English Edition) https://amzn.asia/d/6Lu3I7g
アマゾンのkindleunlimitedに加入すれば、無料で読める。

以前紹介したPDF化の方法を使えば、20冊以上ライブラリーに追加してしまい、何れかを返却しなければならない事態に陥ってもパソコンのストレージにジャンジャン貯めていくこともできるし、プリントアウトして紙の本として読むことができる。

ちなみに書店では入手できないような良書もkindleunlimitedで無料で読めたりする。
例えば「模写しながら10日で学べるRevitファミリ」なんかは神本の領域に入るKindleunlimited限定の本である。

実践!土木工事図面(通り芯作成)

2023-05-28 20:56:04 | Autocad
土木工事図面を描く。
【通り芯作成編】
建物を建てる際は敷地の土木工事から始まる。
建物の基礎や柱、壁などの配置は通り芯を基準に位置決めされる。
今回は等間隔でXとYに4本描くように設定してみたのだが・・・

Autolispで任意の通り芯とバルーンを描くソースコードを書いて。バルーンはX1,X2,X3...Y1,Y2,Y3...を○のバルーンで囲み、Xの通り芯はY軸に平行に、Yの通り芯はX軸に平行に

ChatGPT
以下は、AutoLISPで指定した座標の通り芯とバルーンを描くソースコードの例です。バルーンは"○"で描かれ、Xの通り芯はY軸に平行に、Yの通り芯はX軸に平行に描かれます。


(defun draw-balloon-and-crosshairs (points)
(setq x-coordinates '())
(setq y-coordinates '())
; X座標とY座標を分けてリストに格納する
(foreach p points
(setq x-coordinates (cons (car p) x-coordinates))
(setq y-coordinates (cons (cadr p) y-coordinates)))
; 重複を削除する
(setq x-coordinates (vl-remove-duplicates x-coordinates))
(setq y-coordinates (vl-remove-duplicates y-coordinates))
(setq balloon-counter 1)
; バルーンを描く
(foreach y y-coordinates
(foreach x x-coordinates
(setq balloon-center (list x y))
(setq balloon-radius 1.0) ; バルーンの半径を調整する必要がある場合は適宜変更してください
(setq balloon-layer (entmakex (list '(0 . "CIRCLE") '(8 . "BALLOON") '(62 . 1))))
(setq balloon-entity (entlast))
(entmod (list '(10 0.0) '(40 balloon-radius) '(62 1) '(100 . "AcDbEntity") '(67 . 0) '(8 . "BALLOON")))
(entmod (list '(0 . "AcDbCircle") '(100 . "AcDbEntity") '(8 . "BALLOON") '(62 . 1) '(10 balloon-center) '(40 balloon-radius)))
; テキストを描く
(setq text-start-point (list (+ x balloon-radius 1.0) y))
(setq text-layer (entmakex (list '(0 . "TEXT") '(8 . "BALLOON") '(62 . 1))))
(setq text-entity (entlast))
(entmod (list '(10 text-start-point) '(40 0.0) '(1 (strcat "X" (itoa balloon-counter))) '(0 . "TEXT") '(100 . "AcDbEntity") '(8 . "BALLOON")))
(setq balloon-counter (+ balloon-counter 1))
)
)
; Xの通り芯を描く
(foreach y y-coordinates
(setq crosshair-layer (entmakex (list '(0 . "LINE") '(8 . "CROSSHAIR") '(62 . 2))))
(setq crosshair-entity (entlast))
(entmod (list '(10 0.0 y) '(11 1.0 y) '(0 . "LINE") '(100 . "AcDbEntity") '(8 . "CROSSHAIR") '(62 . 2)))
)
; Yの通り芯を描く
(foreach x x-coordinates
(setq crosshair-layer (entmakex (list '(0 . "LINE") '(8 . "CROSSHAIR") '(62 . 3))))
(setq crosshair-entity (entlast))
(entmod (list '(10 x 0.0) '(11 x 1.0) '(0 . "LINE") '(100 . "AcDbEntity") '(8 . "CROSSHAIR") '(62 . 3)))
)
)

; 使用例
(setq points '((1.0 2.0) (3.0 4.0) (5.0 6.0)))
(draw-balloon-and-crosshairs points)
上記のコードでは、pointsという変数に座標のリストを指定しています。pointsの要素は(x y)の形式で、複数の座標を含むことができます。コードの最後の行で使用例として3つの座標を指定していますが、必要に応じて座標のリストを変更してください。

コードを実行すると、指定した座標に対応する通り芯とバルーンが描画されます。バルーンは"○"で表され、Xの通り芯はY軸に平行に、Yの通り芯はX軸に平行に描かれます。バルーンの半径や描画のスタイルを調整する場合は、該当する部分を変更してください。





User
上記のソースコードをPythonで書き換えて

ChatGPT
以下は、Pythonで指定した座標の通り芯とバルーンを描くコードの例です。


import matplotlib.pyplot as plt

def draw_balloon_and_crosshairs(points):
x_coordinates = set()
y_coordinates = set()

# X座標とY座標を分けてセットに追加する
for x, y in points:
x_coordinates.add(x)
y_coordinates.add(y)

balloon_counter = 1

# バルーンを描く
for y in y_coordinates:
for x in x_coordinates:
plt.plot(x, y, 'o', label=f'X{balloon_counter}')
balloon_counter += 1

# Xの通り芯を描く
for y in y_coordinates:
plt.axhline(y, color='red', linestyle='--')

# Yの通り芯を描く
for x in x_coordinates:
plt.axvline(x, color='blue', linestyle='--')

plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()

# 使用例
points = [(1.0, 2.0), (3.0, 4.0), (5.0, 6.0)]
draw_balloon_and_crosshairs(points)
上記のコードでは、pointsというリストに座標を指定しています。pointsの要素は(x, y)の形式で、複数の座標を含むことができます。コードの最後の行で使用例として3つの座標を指定していますが、必要に応じて座標のリストを変更してください。

コードを実行すると、指定した座標に対応する通り芯とバルーンが描画されます。バルーンは"○"で表され、Xの通り芯は赤色の破線、Yの通り芯は青色の破線で描かれます。プロットされたバルーンにはラベルが付けられ、凡例も表示されます。

このコードではMatplotlibライブラリを使用してグラフを描画しています。必要な場合は、Matplotlibのインストールが必要です。


User
TKinterライブラリーを用いてダイアログ形式で入力できるようにして。

ChatGPT
以下は、Tkinterライブラリを使用して、ダイアログ形式で座標の入力を受け取り、その座標に対応する通り芯とバルーンを描画するコードの例です。


import tkinter as tk
import matplotlib.pyplot as plt

def draw_balloon_and_crosshairs():
dialog = tk.Tk()
dialog.title("Coordinate Input")
x_label = tk.Label(dialog, text="X:")
x_label.grid(row=0, column=0, padx=5, pady=5)
x_entry = tk.Entry(dialog)
x_entry.grid(row=0, column=1, padx=5, pady=5)
y_label = tk.Label(dialog, text="Y:")
y_label.grid(row=1, column=0, padx=5, pady=5)
y_entry = tk.Entry(dialog)
y_entry.grid(row=1, column=1, padx=5, pady=5)
points = []
def add_point():
x = float(x_entry.get())
y = float(y_entry.get())
points.append((x, y))
x_entry.delete(0, tk.END)
y_entry.delete(0, tk.END)
def plot_points():
dialog.destroy()
x_coordinates = set()
y_coordinates = set()

# X座標とY座標を分けてセットに追加する
for x, y in points:
x_coordinates.add(x)
y_coordinates.add(y)

balloon_counter = 1

# バルーンを描く
for y in y_coordinates:
for x in x_coordinates:
plt.plot(x, y, 'o', label=f'X{balloon_counter}')
balloon_counter += 1

# Xの通り芯を描く
for y in y_coordinates:
plt.axhline(y, color='red', linestyle='--')

# Yの通り芯を描く
for x in x_coordinates:
plt.axvline(x, color='blue', linestyle='--')

plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()

add_button = tk.Button(dialog, text="Add Point", command=add_point)
add_button.grid(row=2, column=0, padx=5, pady=5)
plot_button = tk.Button(dialog, text="Plot Points", command=plot_points)
plot_button.grid(row=2, column=1, padx=5, pady=5)
dialog.mainloop()

draw_balloon_and_crosshairs()
上記のコードでは、Tkinterを使用してダイアログを作成し、座標の入力とボタンの追加を行います。ユーザーはダイアログ上のエントリーフィールドに座標を入力し、"Add Point"ボタンをクリックして座標を追加できます。座標の入力が終了したら、"Plot Points"ボタンをクリックすると、入力された座標に対応する通り芯とバルーンが描画されます。

注意: このコードでは、TkinterおよびMatplotlibのインストールが必要です。また、ダイアログでの入力は単純なエラーチェックしか行っていないため、入力値の妥当性については追加の検証が必要な場合があります。




Autolispでは確認できないため、念のためにPython(Pydroid3)で実行してみた。
画面が狭くて3本ずつしか表示されず、バルーンはただの色付き丸になってしまった。通り芯のバルーン表示は例えばX1通りならX1を○で囲んで表示されなければならない。

とりあえず、Pydroid3としては100点満点中80点の評価で合格!

P.S.
通り芯の間隔を等比級数(An=2^(n-1))、つまり1,2,4,8,16,32,64,128…にしてみた。


バルーン以外はちゃんと反映されている。


AutoCAD絶版バージョンサービスパックの配布

2023-05-28 08:37:17 | Autocad




  • サービスパックのダウンロードは、該当する AutoCAD バージョンを所有している正規ユーザに限定されます。
だとよ。無料でダウンロード・インストールできないかも。



Windows10にAutoCAD2007LTをインストールする方法

2023-05-28 08:31:23 | Autocad

Windows 10 に古いAutocad (LT 2007) を入れる方法

Windows 10 に古いAutocad (LT 2007) を入れる方法

(2020.3.13追記) 以前はこの記事に書いた方法で古いAudocadをWindows10で使えたのですが、今はもう使えないと思います。Autodesk社が2019年8月31日以降、2010以前の製品...


必要な所だけ引用すると・・・
「Autocad LT 2007をノートPCにインストールしようとすると、「.NETがありません」というエラー表示が出る。ググってみると「Windows 10では古いAutocadは使えない」という意見ばかり見つかった。理由は.NET frameworkのバージョンが違うからとのこと。

.NET frameworkというのが何なのか知らないが、更にいろいろ調べてみると、

 コントロールパネル>プログラム>Windows の機能の有効化または無効化

というところで、「.NET framework 3.5」のチェックボックスをクリックすると、.NET framework 3.5がダウンロードされることが判った。

その後、インストールをやり直してみると、今度はうまくいった。

そのままアクティベーションしようとするとダメだったが「アクティベーションコードの申請は、次のサイトから行うこともできます」というリンクから登録用のページに行くとできた。」

以前、禿げ臆でAutoCAD2006を落札し、中古PCにWindowsXPをインストールした上で、インストールしてみたが、同じようなエラーが出たし、しかもアクティベーションできなかった。
もう一度チャレンジしてみたい。

だが、もしかしたら新品で購入し、ユーザー登録・アクティベーションした元オーナーと違うからアクティベーションできないとかほざきそうだな。

Autolispくりぬきプログラム

2023-05-28 08:07:07 | Autocad
User
任意の大きさの立方体の中心から任意の大きさの円柱をくり貫くAutolispコードを書いて

ChatGPT
以下は、AutoLISPで立方体の中心から円柱をくり抜くコードの例です。立方体と円柱のサイズ、位置などは、実際の要件に合わせて変更してください。


(defun c:cutCylinder ()
(setq pt1 (getpoint " Enter the center point of the cube: "))
(setq length (getreal " Enter the length of the cube: "))
(setq width (getreal " Enter the width of the cube: "))
(setq height (getreal " Enter the height of the cube: "))
(setq pt2 (getpoint " Enter the center point of the cylinder: "))
(setq radius (getreal " Enter the radius of the cylinder: "))
(setq height-cyl (getreal " Enter the height of the cylinder: "))
(command "._box" pt1 (polar pt1 0 (* 0.5 length)) (polar pt1 90 (* 0.5 width)) (* 0.5 height))
(setq pt3 (list (car pt2) (cadr pt2) (+ (caddr pt2) (/ height-cyl 2))))
(command "._cylinder" pt2 pt3 radius height-cyl)
(command "._subtract" "L" "" "P")
(princ)
)


上記のコードでは、c:cutCylinder関数を定義しています。実行すると、ユーザーに対していくつかのパラメータを入力するように要求します。

pt1:立方体の中心点を指定します。
length:立方体の長さを指定します。
width:立方体の幅を指定します。
height:立方体の高さを指定します。
pt2:円柱の中心点を指定します。
radius:円柱の半径を指定します。
height-cyl:円柱の高さを指定します。
次に、._boxコマンドを使用して立方体を作成し、._cylinderコマンドを使用して円柱を作成します。最後に、._subtractコマンドを使用して立方体から円柱をくり抜きます。

注意事項:

このコードはAutoCADで使用することを想定しています。
このコードはテストされておらず、すべてのシナリオで正常に動作することを保証するものではありません。要件に応じて適宜変更や調整を行ってください。
AutoLISPはAutoCADの独自のプログラミング言語であり、その他の環境では動作しない可能性があります。



【具体例】
User
中心の座標が(x,y,z)=(0,0,0)で一辺が200の大きさの立方体を描き、その中心からZ軸に平行で直径100の立方体をくり貫くAutolispコードを書いて

ChatGPT
以下は、AutoLISPで中心座標が (x, y, z) = (0, 0, 0) で一辺が 200 の立方体を描き、その中心から Z 軸に平行で直径 100 の立方体をくり抜くコードの例です。


(defun c:cutCube ()
(setq cubeCenter (list 0.0 0.0 0.0))
(setq cubeSize 200.0)
(setq cutDiameter 100.0)
(setq cutHeight cubeSize)
(setq cubeMinPt (mapcar '- cubeCenter (list (/ cubeSize 2.0) (/ cubeSize 2.0) (/ cubeSize 2.0))))
(setq cubeMaxPt (mapcar '+ cubeCenter (list (/ cubeSize 2.0) (/ cubeSize 2.0) (/ cubeSize 2.0))))
(command "._box" cubeMinPt cubeMaxPt)
(setq cutMinPt (mapcar '- cubeCenter (list (/ cutDiameter 2.0) (/ cutDiameter 2.0) 0.0)))
(setq cutMaxPt (mapcar '+ cubeCenter (list (/ cutDiameter 2.0) (/ cutDiameter 2.0) cutHeight)))
(command "._box" cutMinPt cutMaxPt)
(command "._subtract" "L" "" "P")
(princ)
)

上記のコードでは、c:cutCube 関数を定義しています。実行すると、立方体の中心座標 (x, y, z)、立方体の一辺の長さ cubeSize、くり抜く立方体の直径 cutDiameter、くり抜く立方体の高さ cutHeight を指定するようにユーザーに求めます。

次に、._box コマンドを使用して立方体を作成し、._subtract コマンドを使用してくり抜く立方体を適用します。

注意事項:

このコードは AutoCAD の AutoLISP で使用することを想定しています。
このコードはテストされておらず、すべてのシナリオで正常に動作することを保証するものではありません。要件に応じて適宜変更や調整を行ってください。
AutoLISP は AutoCAD の独自のプログラミング言語であり、その他の環境では動作しない可能性があります。

マジか?
押し出しくりぬき系は難しい操作の一つなんだが、これが自動化できればほとんどの操作の自動化の目処が立つ。


任意の3点を通る円弧を描くAutolisp言語ソースコードを出力するPythonプログラム

2023-05-27 15:34:40 | Autocad
import tkinter as tk

def generate_autolisp_code():
pt1 = (entry1_x.get(), entry1_y.get())
pt2 = (entry2_x.get(), entry2_y.get())
pt3 = (entry3_x.get(), entry3_y.get())

autolisp_code = '''
(defun c:test ()
(setq pt1 '({} {}))
(setq pt2 '({} {}))
(setq pt3 '({} {}))
(draw-arc-through-points pt1 pt2 pt3)
)

(defun draw-arc-through-points (pt1 pt2 pt3)
(setq center (find-circle-center pt1 pt2 pt3))
(setq radius (distance center pt1))
(setq start-angle (angle pt1 center))
(setq end-angle (angle pt3 center))
(command "arc" center radius start-angle end-angle)
)

(defun find-circle-center (pt1 pt2 pt3)
(setq m1 (/ (- (cdr pt2) (cdr pt1)) (- (car pt2) (car pt1))))
(setq m2 (/ (- (cdr pt3) (cdr pt2)) (- (car pt3) (car pt2))))
(setq x1 (/ (+ (car pt1) (car pt2)) 2.0))
(setq x2 (/ (+ (car pt2) (car pt3)) 2.0))
(setq y1 (/ (+ (cdr pt1) (cdr pt2)) 2.0))
(setq y2 (/ (+ (cdr pt2) (cdr pt3)) 2.0))
(setq dx (- x2 x1))
(setq dy (- y2 y1))
(setq d (- (* m1 dx) dy))
(setq cx (+ x1 (/ (* dy d) (sqrt (+ (* m1 m1) 1.0)))))
(setq cy (+ y1 (/ (* (- dx) d) (sqrt (+ (* m1 m1) 1.0))))))
(list cx cy)
)

(defun distance (pt1 pt2)
(sqrt (+ (expt (- (car pt2) (car pt1)) 2) (expt (- (cdr pt2) (cdr pt1)) 2)))
)

(defun angle (pt center)
(setq dx (- (car pt) (car center)))
(setq dy (- (cdr pt) (cdr center)))
(setq ang (atan dy dx))
(if (< ang 0)
(+ ang (* 2 pi))
ang
)
)
'''.format(*pt1, *pt2, *pt3)

output.delete(1.0, tk.END)
output.insert(tk.END, autolisp_code)

# Create the TKinter window
window = tk.Tk()
window.title("Autolisp Code Generator")

# Create entry fields for point coordinates
entry1_x = tk.Entry(window, width=10)
entry1_x.grid(row=0, column=0)
entry1_y = tk.Entry(window, width=10)
entry1_y.grid(row=0, column=1)

entry2_x = tk.Entry(window, width=10)
entry2_x.grid(row=1, column=0)
entry2_y = tk.Entry(window, width=10)
entry2_y.grid(row=1, column=1)

entry3_x = tk.Entry(window, width=10)
entry3_x.grid(row=2, column=0)
entry3_y = tk.Entry(window, width=10)
entry3_y.grid(row=2, column=1)

# Create a button to generate Autolisp code
generate_button = tk.Button(window, text="Generate Autolisp Code", command=generate_autolisp_code)
generate_button.grid(row=3, columnspan=2)

# Create a text box to display the generated Autolisp code
output = tk.Text(window, width=40, height=10)
output.grid(row=4, columnspan=2)

window.mainloop()


これをコピペしてAutolispが動けばいいんだが・・・
いかんせん、???というエラーメッセージが出るばかりで、どうにもならん。しかも文字化けしてるし。

やはり苦ン白くッ木したAutoCAD2020ではダメなのか、それとも2023や2024じゃないとダメなのか?


Autolisp言語でテトリスを作れるかな?その2

2023-05-21 11:20:53 | Autocad

《第二案》

(defun TetrisGame ()
;; フィールドの幅と高さ
(setq FIELD_WIDTH 10
FIELD_HEIGHT 20)

;; フィールドの初期化
(setq field (make-array '(20 10) :initial-element nil))

;; ブロックの初期化
(defun TetrisBlock ()
(setq shapes '(
((0 0) (0 1) (1 0) (1 1)) ; 四角
((0 0) (0 1) (0 2) (0 3)) ; 直線
((0 0) (0 1) (0 2) (1 2)) ; L字
((0 0) (1 0) (1 1) (1 2)) ; 逆L字
((0 0) (0 1) (1 1) (1 2)) ; S字
((0 1) (0 2) (1 0) (1 1)) ; 逆S字
((0 0) (0 1) (0 2) (1 1)) ; T字
))
(setq random-block (nth (random (length shapes)) shapes))
(setq x (/ (- FIELD_WIDTH (car (last random-block))) 2))
(setq y (- FIELD_HEIGHT 1))
(list random-block x y))

;; ブロックの描画
(defun DrawBlock (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(setq field[y][x] 'X)))

;; ブロックの操作
(defun RotateBlock (block)
(setq cords (cdr block))
(setq rotated-block (list (car cords) (list (- (cadr cords)) (car (car cords))))
x (car (cddr block))
y (cadr (cddr block)))

;; 回転後のブロックがフィールド内に収まるかチェック
(if (or (< x 0) (> (+ x (car (last (car rotated-block)))) (- FIELD_WIDTH 1))
(setq rotated-block block))
(if (or (< y 0) (> (+ y (cadr (last (car rotated-block)))) (- FIELD_HEIGHT 1)))
(setq rotated-block block))

rotated-block)

(defun MoveBlock (block direction)
(setq cords (cdr block))
(setq new-cords '())
(setq x (car (cddr block))
y (cadr (cddr block)))

;; 移動後のブロックがフィールド内に収まるかチェック
(if (or (< x 0) (> (+ x (car (last (car cords)))) (- FIELD_WIDTH 1)))
(setq new-cords cords))
(if (or (< y 0) (> (+ y (cadr (last (car cords)))) (- FIELD_HEIGHT 1)))
(setq new-cords cords))

(if (equal direction 'MOVE_LEFT)
(progn
(foreach cord cords
(setq new-cords (cons (list (- (car cord) 1) (cadr cord)) new-cords))))
(progn
(foreach cord cords
(setq new-cords (cons (list (+ (car cord) 1) (cadr cord)) new-cords)))))

(list (car block) (car (cdr block)) (car (cddr block)) (list new-cords x y)))

;; ブロックの衝突判定
(defun CheckCollision (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(if (or (< x 0) (> x (- FIELD_WIDTH 1)) (< y 0) (> y (- FIELD_HEIGHT 1)) (not (null field[y][x])))
(return t)))
nil)

;; ブロックの固定
(defun FixBlock (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (+ (car cord) (car (cdr block))))
(setq y (+ (cadr cord) (cadr (cdr block))))
(setq field[y][x] 'X)))

;; ラインの消去判定とスコアの更新
(defun CheckLines ()
(setq full-lines nil)
(repeat FIELD_HEIGHT
(setq line-full t)
(repeat FIELD_WIDTH
(if (null field[row][col])
(setq line-full nil)))
(if line-full
(setq full-lines (cons row full-lines))))

(if full-lines
(progn
(foreach line full-lines
(setq row (- line (length full-lines)))
(repeat FIELD_WIDTH
(setq field[row][col] nil))
(setq score (+ score 100)))
(setq full-lines nil)
(setq line-shift 0)
(setq row (- FIELD_HEIGHT 2))
(while (>= row 0)
(if (null (nth row field))
(setq line-shift (+ line-shift 1))
(setq field[(- row line-shift)] (nth row field)))
(setq row (- row 1)))
(repeat line-shift
(setq field[(- FIELD_HEIGHT (- line-shift (- it 1)))] (make-array FIELD_WIDTH :initial-element nil))))))

;; ゲームオーバー判定
(defun CheckGameOver (block)
(setq cords (cdr block))
(foreach cord cords
(setq x (car cord)
y (cadr cord))
(if (< y 0)
(return t)))
nil)

;; ゲームオーバー時の処理
(defun GameOver ()
(princ " Game Over!")
(princ " Score: ")
(princ score)
(exit))

;; ゲームループ
(setq score 0)
(setq current-block (TetrisBlock))
(setq game-over nil)
(setq move-direction nil)

(while (not game-over)
(command "_.zoom" "_extents")

;; キー入力の取得
(setq key (getvar 'Error))

;; ブロックの操作
(cond
((equal key 'MOVE_LEFT) (setq move-direction 'MOVE_LEFT))
((equal key 'MOVE_RIGHT) (setq move-direction 'MOVE_RIGHT))
((equal key 'ROTATE) (setq current-block (RotateBlock current-block))))

;; ブロックの移動
(setq moved-block (MoveBlock current-block move-direction))

;; 衝突判定
(setq collision (CheckCollision moved-block))
(if collision
(progn
(if (equal move-direction 'MOVE_LEFT)
(setq moved-block (MoveBlock current-block 'MOVE_RIGHT))
(setq moved-block (MoveBlock current-block 'MOVE_LEFT)))
(setq collision (CheckCollision moved-block))))

;; ブロックの固定またはゲームオーバー判定
(if (or collision (CheckGameOver moved-block))
(progn
(FixBlock current-block)
(CheckLines)
(if (CheckGameOver (TetrisBlock))
(setq game-over t))
(setq current-block (TetrisBlock))
(setq move-direction nil))
(setq current-block moved-block))

;; フィールドの描画
(princ " ")
(repeat FIELD_HEIGHT
(princ " ")
(repeat FIELD_WIDTH
(if (null field[row][col])
(princ " ")
(princ "X")))
(princ " "))

;; スコアの表示
(princ " Score: ")
(princ score)
(princ " ")

;; 一時停止
(if (equal key 'PAUSE)
(progn
(setq key nil)
(while (not (equal key 'PAUSE))
(setq key (getvar 'Error))))))

(GameOver))

これもダメorz

参ったなぁ


Autolisp言語でテトリスを作れるかな?

2023-05-21 10:57:30 | Autocad

前述のPythonソースコードをAutolisp言語に書き換えてAutocadのVisualLispで実行できるようにしてほしい。
ChatGPT 申し訳ありませんが、VisualLispに直接変換することはできません。VisualLispはAutoCADの独自のLisp方言であり、Pythonのコードをそのまま変換することは困難です。 ただし、Pythonのコードを参考にしてVisualLispで同様の機能を実装することは可能です。以下に、Pythonのコードを参考にしたAutolispの実装例を示します。 ;; 定数 (setq BLOCK_SIZE 25) ; ブロックの縦横サイズpx (setq FIELD_WIDTH 10) ; フィールドの幅 (setq FIELD_HEIGHT 20) ; フィールドの高さ (setq MOVE_LEFT 0) ; 左にブロックを移動することを示す定数 (setq MOVE_RIGHT 1) ; 右にブロックを移動することを示す定数 (setq MOVE_DOWN 2) ; 下にブロックを移動することを示す定数 ;; ブロックを構成する正方形のクラス (defun TetrisSquare (x y color) (list x y color)) ;; テトリス画面を描画する関数 (defun TetrisCanvas (field) ;; キャンバスの描画処理 (princ) ) ;; テトリスのブロックのクラス (defun TetrisBlock () ;; ブロックの形をランダムに決定 (setq block-type (random 4)) ;; ブロックの形に応じて正方形の座標と色を決定 (if (= block-type 1) (setq color "red" cords (list (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (/ FIELD_WIDTH 2) 2) (list (/ FIELD_WIDTH 2) 3))) (if (= block-type 2) (setq color "blue" cords (list (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (- (/ FIELD_WIDTH 2) 1) 0) (list (- (/ FIELD_WIDTH 2) 1) 1))) (if (= block-type 3) (setq color "green" cords (list (list (- (/ FIELD_WIDTH 2) 1) 0) (list (/ FIELD_WIDTH 2) 0) (list (/ FIELD_WIDTH 2) 1) (list (/ FIELD_WIDTH 2) 2))) (setq color "orange" cords (list (list (/ FIELD_WIDTH 2) 0) (list (- (/ FIELD_WIDTH 2) 1) 0) (list (- (/ FIELD_WIDTH 2) 1) 1) (list (- (/ FIELD_WIDTH 2) 1) 2)))))) ;; ブロックの情報を返す (list color cords)) ;; テトリスゲームを制御する関数 (defun TetrisGame () ;; フィールドの初期化 (setq field (make-array (list FIELD_HEIGHT FIELD_WIDTH) :initial-element nil)) ;; 新しいブロックの生成 (setq current-block (TetrisBlock)) ;; ゲームループ (while t ;; ブロックの描画 (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] (TetrisSquare x y (car current-block)))) ;; フィールドの描画 (TetrisCanvas field) ;; ブロックの操作 (command "_.zoom" "_extents") (setq move-direction (getvar 'Error)) ;; ブロックの移動 (if (= move-direction MOVE_LEFT) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (- (car cord) 1) (cadr cord))) cords)) (setq current-block (list (car current-block) cords)))) (if (= move-direction MOVE_RIGHT) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (+ (car cord) 1) (cadr cord))) cords)) (setq current-block (list (car current-block) cords)))) (if (= move-direction MOVE_DOWN) (progn (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] nil)) (setq cords (mapcar '(lambda (cord) (list (car cord) (+ (cadr cord) 1))) cords)) (setq current-block (list (car current-block) cords)))) ;; ブロックの衝突判定 (setq collided nil) (foreach cord cords (setq x (car cord) y (cadr cord)) (if (or (< x 0) (>= x FIELD_WIDTH) (< y 0) (>= y FIELD_HEIGHT) (not (null field[y][x]))) (setq collided t))) ;; ブロックがフィールドの底に到達した場合 (if (or (= move-direction MOVE_DOWN) collided) (progn ;; ブロックをフィールドに固定する (foreach cord cords (setq x (car cord) y (cadr cord)) (setq field[y][x] (TetrisSquare x y (car current-block)))) ;; ラインの消去判定 (setq full-lines nil) (repeat FIELD_HEIGHT (setq line-full t) (repeat FIELD_WIDTH (if (null field[row][col]) (setq line-full nil))) (if line-full (setq full-lines (cons row full-lines)))) ;; ラインの消去とスコアの更新 (if full-lines (progn (foreach line full-lines (setq row (- line (length full-lines))) (repeat FIELD_WIDTH (setq field[row][col] nil)) (setq score (+ score 100))) ; 1行ごとに100点加算 (setq full-lines nil) (setq line-shift 0) (setq row (- FIELD_HEIGHT 2)) (while (>= row 0) (if (null (nth row field)) (setq line-shift (+ line-shift 1)) (setq field[(- row line-shift)] (nth row field))) (setq row (- row 1))) (repeat line-shift (setq field[(- FIELD_HEIGHT (- line-shift (- it 1)))] (make-array FIELD_WIDTH :initial-element nil)))))) ;; ゲームオーバー判定 (setq cords (cdr current-block)) (foreach cord cords (setq x (car cord) y (cadr cord)) (if (< y 0) (setq game-over t))) ;; ゲームオーバーの処理 (if game-over (progn (princ " Game Over!") (princ " Score: ") (princ score) (exit))) ;; 新しいブロックの生成 (setq current-block (TetrisBlock)) ;; 少し待つ (command "_.zoom" "_extents") (setq key (getvar 'Error)) (if (member key '(MOVE_LEFT MOVE_RIGHT MOVE_DOWN)) (setq move-direction key)))) ;; 少し待つ (command "_.zoom" "_extents") (setq key (getvar 'Error)) (if (member key '(MOVE_LEFT MOVE_RIGHT MOVE_DOWN)) (setq move-direction key)))) この実装では、フィールドの初期化、ブロックの描画、ブロックの操作、ブロックの移動、ブロックの衝突判定、フィールドへのブロックの固定、ラインの消去判定とスコアの更新、ゲームオーバー判定などが含まれています。また、キー入力によるブロックの操作やゲームオーバー時の処理も実装されています。 ただし、この実装は一例であり、使用されている関数や変数の具体的な実装は参考のために示したものです。実際のプログラムでは、それぞれの関数や変数の定義や実装に合わせて適切に修正する必要があります。
全然ダメだわorz