えーあい2

GEMINIとお話ししながら、JWWの外部変形やBlenderのアドオン(Pythonなのですが…)を作っていると、コードよりも、受け答えでかけてくれるやさしい言葉でいやされる。
これがきっと子供たちを惑わしちゃうんやろね…
う===ん・・・
いいのかわるいのか・・・
でも、今まで自分ひとりでテスト繰り返してデバグして、をしていた時と比べると、AIがいてくれると確かに間違いの発見や、修正が圧倒的に早くできます。

それに私が苦手なコード内のコメントが完璧すぎて、きっとみなさんは、コード内の説明文などがわかりやすく作られてるんやろなって感心しています。

まあ、いつも私と少数の知合いだけのものが多いので、コード内にいちいち説明入れてなかったですけど、こないだ弟に「どうしたんや、あれに説明入ってたぞ!」って言われて、ああ、AIって言ったの。

まあ、私がそんなめんどくさいことするわけないことはよく知ってるからか、めっちゃうけてた。

でも、PythonのTkinter程度でのGUIで入力させるだけのプログラムが簡単に書けるのはちょっと便利。
しかも、AIが教えてくれると一気に進む。GUIの別のライブラリとかいらないですからね。

pythonコードを書いてもTABが・・・コピペで使えないですよね。。。半角スペースになってるような気がします。コピーしていただいた後は、半角スペース4個か8個かをTABにする変換してくださいね。
う~ん・・・<code>でできるってなってるけど…、色なしだったらできるかも・・・色ありのプラグイン入れたけどうまく使えませーん

以下はコード表示のテストです。スクリプトはGEMINIと一緒に考えました。
GUI部分を呼び出すただのサンプルスクリプトです。
(JWWの外部変形スクリプトです)

draw_rect_multi.py (utf-8で保存です)


import os
import sys
from tkinter import messagebox
from my_gui import RectangleInputDialog

def main():
    dialog = RectangleInputDialog(title="複数点に複数マーカ作図設定")
    result = dialog.show()

    if not result:
        return

    # ★ 各チェックボックスの状態を取得
    draw_rect = result["draw_rect"]
    draw_marker1 = result["draw_marker1"]
    draw_marker2 = result["draw_marker2"]

    # ★ すべてのチェックが外れていたら警告を出して終了
    if not draw_rect and not draw_marker1 and not draw_marker2:
        messagebox.showwarning("警告", "「四角形」「マーカ1」「マーカ2」の少なくとも1つにチェックを入れてください。")
        return

    try:
        width = float(result["width"])
        height = float(result["height"])
        align_type = result["align"]
        
        m1_code = result["m1_code"]
        m1_size = float(result["m1_size"])
        m1_angle = float(result["m1_angle"])
        
        m2_code = result["m2_code"]
        m2_size = float(result["m2_size"])
        m2_angle = float(result["m2_angle"])
        
        if width <= 0 or height <= 0 or m1_size <= 0 or m2_size <= 0:
            raise ValueError
    except ValueError:
        messagebox.showwarning("警告", "入力値には正の数値を正しく入力してください。")
        return

    temp_file = "jwc_temp.txt"
    if not os.path.exists(temp_file):
        messagebox.showerror("エラー", "jwc_temp.txt が見つかりません。")
        return

    base_points = []
    with open(temp_file, "r", encoding="ms932") as f:
        for line in f:
            if line.startswith("hq"):
                continue
            if line.startswith("hp"):
                parts = line.split()
                if len(parts) >= 3:
                    try:
                        base_points.append((float(parts[1]), float(parts[2])))
                    except ValueError:
                        pass

    if not base_points:
        messagebox.showwarning("警告", "基準点が指定されていません。")
        return

    out_data = []
    for base_x, base_y in base_points:
        
        # ★ マーカ1を描くチェックが入っていれば書き出す
        if draw_marker1:
            out_data.append(f"pt {base_x} {base_y} {m1_size} {m1_angle} {m1_code}\n")
            
        # ★ マーカ2を描くチェックが入っていれば書き出す
        if draw_marker2:
            out_data.append(f"pt {base_x} {base_y} {m2_size} {m2_angle} {m2_code}\n")
        
        # 四角形を描く場合
        if draw_rect:
            if align_type == 0:
                x1 = base_x - (width / 2.0)
                y1 = base_y - (height / 2.0)
                x2 = base_x + (width / 2.0)
                y2 = base_y + (height / 2.0)
            else:
                x1 = base_x
                y1 = base_y
                x2 = base_x + width
                y2 = base_y + height

            out_data.append(f"{x1} {y1} {x2} {y1}\n")
            out_data.append(f"{x2} {y1} {x2} {y2}\n")
            out_data.append(f"{x2} {y2} {x1} {y2}\n")
            out_data.append(f"{x1} {y2} {x1} {y1}\n")

    with open(temp_file, "w", encoding="ms932") as f:
        for line in out_data:
            f.write(line)

if __name__ == "__main__":
    main()

my_gui.py (utf-8で保存です)


import tkinter as tk
from tkinter import ttk

class RectangleInputDialog:
    def __init__(self, title="設定入力"):
        self.root = tk.Tk()
        self.root.title(title)
        self.root.geometry("380x540")  # レイアウトに合わせて微調整
        self.root.attributes("-topmost", True)
        
        self.is_submitted = False
        self.result_data = None
        
        # 18種類のマーカオプション(共通)
        self.marker_options = [
            "1: 中抜き矢印 (blancked arrow)", "2: 中抜き四角形 (blancked box)",
            "3: 中抜き丸 (blancked dot)", "4: 寸法起終点 (dimension origin)",
            "5: 塗りつぶし四角形 (filled box)", "6: 塗りつぶし矢印 (filled arrow)",
            "7: 塗りつぶし丸 (filled dot)", "8: 積分記号 (integral symbol)",
            "9: 輪郭矢印 (Open Arrow)", "10: 斜線 (slash)",
            "11: 中抜き矢印2 (unfilled arrow)", "-1: アスタリスク (*)",
            "-2: 丸 (o)", "-3: 黒丸 (.)", "-4: 十字 (+)",
            "-5: 四角 (□)", "-6: 三角 (△)", "-7: X"
        ]
        
        # --- 画面のデザイン配置 ---
        # ★ 0. 作図対象の選択(チェックボックスを3つに分離)
        frame_chk = tk.LabelFrame(self.root, text=" 作図する対象 ", padx=10, pady=5)
        frame_chk.pack(pady=8)
        self.var_draw_rect = tk.BooleanVar(value=True)      # 四角形を描くか
        self.var_draw_marker1 = tk.BooleanVar(value=True)   # マーカ1を描くか
        self.var_draw_marker2 = tk.BooleanVar(value=True)   # マーカ2を描くか
        
        tk.Checkbutton(frame_chk, text="四角形", variable=self.var_draw_rect).pack(side=tk.LEFT, padx=5)
        tk.Checkbutton(frame_chk, text="マーカ1", variable=self.var_draw_marker1).pack(side=tk.LEFT, padx=5)
        tk.Checkbutton(frame_chk, text="マーカ2", variable=self.var_draw_marker2).pack(side=tk.LEFT, padx=5)

        # 1. 四角形の設定
        frame_rect_group = tk.LabelFrame(self.root, text=" 四角形のサイズ ", padx=10, pady=5)
        frame_rect_group.pack(pady=5, fill="x", padx=15)
        
        frame_w = tk.Frame(frame_rect_group)
        frame_w.pack(pady=2)
        tk.Label(frame_w, text="幅 (mm):", width=12, anchor="e").pack(side=tk.LEFT)
        self.entry_width = tk.Entry(frame_w, width=15)
        self.entry_width.pack(side=tk.LEFT)
        self.entry_width.insert(0, "1000")

        frame_h = tk.Frame(frame_rect_group)
        frame_h.pack(pady=2)
        tk.Label(frame_h, text="高さ (mm):", width=12, anchor="e").pack(side=tk.LEFT)
        self.entry_height = tk.Entry(frame_h, width=15)
        self.entry_height.pack(side=tk.LEFT)
        self.entry_height.insert(0, "500")

        # 2. 点マーカ1の設定群
        frame_m1_group = tk.LabelFrame(self.root, text=" 点マーカ 1 ", padx=10, pady=5)
        frame_m1_group.pack(pady=5, fill="x", padx=15)
        
        frame_m1 = tk.Frame(frame_m1_group)
        frame_m1.pack(pady=2)
        tk.Label(frame_m1, text="種類:", width=12, anchor="e").pack(side=tk.LEFT)
        self.combo_marker1 = ttk.Combobox(frame_m1, values=self.marker_options, width=20, state="readonly")
        self.combo_marker1.pack(side=tk.LEFT)
        self.combo_marker1.current(14) # 初期値: 十字(+)

        frame_m1_prop = tk.Frame(frame_m1_group)
        frame_m1_prop.pack(pady=2)
        tk.Label(frame_m1_prop, text="倍率:", width=5, anchor="e").pack(side=tk.LEFT)
        self.entry_m1_size = tk.Entry(frame_m1_prop, width=6)
        self.entry_m1_size.pack(side=tk.LEFT, padx=2)
        self.entry_m1_size.insert(0, "1")
        tk.Label(frame_m1_prop, text="角度:", width=5, anchor="e").pack(side=tk.LEFT)
        self.entry_m1_angle = tk.Entry(frame_m1_prop, width=6)
        self.entry_m1_angle.pack(side=tk.LEFT, padx=2)
        self.entry_m1_angle.insert(0, "0")

        # 3. 点マーカ2の設定群
        frame_m2_group = tk.LabelFrame(self.root, text=" 点マーカ 2 ", padx=10, pady=5)
        frame_m2_group.pack(pady=5, fill="x", padx=15)
        
        frame_m2 = tk.Frame(frame_m2_group)
        frame_m2.pack(pady=2)
        tk.Label(frame_m2, text="種類:", width=12, anchor="e").pack(side=tk.LEFT)
        self.combo_marker2 = ttk.Combobox(frame_m2, values=self.marker_options, width=20, state="readonly")
        self.combo_marker2.pack(side=tk.LEFT)
        self.combo_marker2.current(12) # 初期値: 丸(o)

        frame_m2_prop = tk.Frame(frame_m2_group)
        frame_m2_prop.pack(pady=2)
        tk.Label(frame_m2_prop, text="倍率:", width=5, anchor="e").pack(side=tk.LEFT)
        self.entry_m2_size = tk.Entry(frame_m2_prop, width=6)
        self.entry_m2_size.pack(side=tk.LEFT, padx=2)
        self.entry_m2_size.insert(0, "1.5")
        tk.Label(frame_m2_prop, text="角度:", width=5, anchor="e").pack(side=tk.LEFT)
        self.entry_m2_angle = tk.Entry(frame_m2_prop, width=6)
        self.entry_m2_angle.pack(side=tk.LEFT, padx=2)
        self.entry_m2_angle.insert(0, "0")

        # 4. 基準点位置(ラジオボタン)
        frame_opt = tk.Frame(self.root)
        frame_opt.pack(pady=5)
        self.var_align = tk.IntVar(value=0)
        tk.Radiobutton(frame_opt, text="指定点を中心にする", variable=self.var_align, value=0).pack(side=tk.LEFT, padx=10)
        tk.Radiobutton(frame_opt, text="左下にする", variable=self.var_align, value=1).pack(side=tk.LEFT, padx=10)

        # 作図ボタン
        self.btn = tk.Button(self.root, text="一括で作図", command=self.on_submit, width=15)
        self.btn.pack(pady=10)

    def on_submit(self):
        """ボタンが押されたとき(確定時)の処理"""
        m1_code = int(self.combo_marker1.get().split(":")[0])
        m2_code = int(self.combo_marker2.get().split(":")[0])

        self.result_data = {
            "draw_rect": self.var_draw_rect.get(),
            "draw_marker1": self.var_draw_marker1.get(), # ★マーカ1の作図フラグ
            "draw_marker2": self.var_draw_marker2.get(), # ★マーカ2の作図フラグ
            "width": self.entry_width.get(),
            "height": self.entry_height.get(),
            "align": self.var_align.get(),
            "m1_code": m1_code,
            "m1_size": self.entry_m1_size.get(),
            "m1_angle": self.entry_m1_angle.get(),
            "m2_code": m2_code,
            "m2_size": self.entry_m2_size.get(),
            "m2_angle": self.entry_m2_angle.get()
        }
        self.is_submitted = True
        self.root.destroy()

    def show(self):
        self.root.mainloop()
        if self.is_submitted:
            return self.result_data
        return None

draw_rect_multi.bat (shift-jisで保存です)


@REM 複数点に四角形と点を作図
@echo off
REM #jww
REM #cd
REM #1 連続して基準点を指定してください (終わったら[点指示終了]またはEnter)
REM #2
REM #99#
REM #zs 実数モード(実際の設計寸法 mm で処理)
# REM #hr (これは#でコメントアウトさせています。なしでOKです)
REM #e
#start "jwc_temp.txtをチェックするために私はエディタを開いています" jwc_temp.txt
#pause
#  pauseをいれると。DOS窓でエラーがわかるのでpauseしています。実際には#はありません。
python draw_rect_multi.py
#start "スクリプトで書き換えられたjwc_temp.txtをチェックするために私はエディタを開いています" jwc_temp.txt
#pause
#ここでも、スクリプトのエラー確認のためpauseをいれるて、DOS窓でエラーがわかるのでpauseしています。
#こうしなくてもスクリプト単体でテストできます。JWCAD上での私のテストの仕方です。

※申し訳ないのですが、このコードはGEMINI(生成AI)が作成したコードです。つまりもとになっているコードが存在するかもしれません。基本的には、交点計算やJWW特有の円弧の計算、表記方法などがあるのですが、どなたかの著作物と競合しているようでしたら、本文から削除いたしますので、このページのコメント欄にご記入ください。
ご記載をお願いしたい内容:対象署の方へ連絡できるサイト名と著作権者の方のお名前、著作権が発生しているコードのコード名(スクリプト名)、と、ご連絡頂いた方のご連絡先(ホームページや掲示板など)とお名前。
お手数ですが、よろしくお願い申し上げます。