CyberChaos(さいばかおす)

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

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

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 の独自のプログラミング言語であり、その他の環境では動作しない可能性があります。

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