土木工事図面を描く。
【通り芯作成編】
建物を建てる際は敷地の土木工事から始まる。
建物の基礎や柱、壁などの配置は通り芯を基準に位置決めされる。
今回は等間隔で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…にしてみた。
バルーン以外はちゃんと反映されている。