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

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


任意の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じゃないとダメなのか?


NCプログラム自動生成AIソフト「ARUMCODE」

2023-05-24 04:24:43 | ノーコード

NCプログラム自動生成AIソフト「ARUMCODE」シリーズすべて使い放題の月額定額制クラウドサービス「ARUM Factory365」の料金プラン発表

NCプログラム自動生成AIソフト「ARUMCODE」シリーズすべて使い放題の月額定額制クラウドサービス「ARUM Factory365」の料金プラン発表

アルム株式会社のプレスリリース(2023年4月3日 11時00分)NCプログラム自動生成AIソフト[ARUMCODE]シリーズすべて使い放題の月額定額制クラウドサービス[ARUM Factory365]...

プレスリリース・ニュースリリース配信シェアNo.1|PR TIMES



Ruby、Javascript用ソースコード自動生成 AI

2023-05-23 02:30:14 | Ruby

ソースコードを自動生成するローコード開発ツール「Jitera」、ベータ版を提供開始

ソースコードを自動生成するローコード開発ツール「Jitera」、ベータ版を提供開始

Jiteraは2022年11月30日、ローコード開発ツール「Jitera」のβ版を提供開始した。Ruby on RailsやJavaScript(Node.js、React)によるWebアプリケーションのソースコードを、...

Global Intelligence and Insight Platform: IT Innovation, ETF Investment

ソースコードを自動生成するローコード開発ツール「JITERA」、ベータ版を提供開始


Jiteraは2022年11月30日、ローコード開発ツール「Jitera」のβ版を提供開始した。Ruby on RailsやJavaScript(Node.js、React)によるWebアプリケーションのソースコードを、GUIベースのエディタを使って自動で生成可能なクラウドサービスである。フロントエンドからバックエンドまで幅広い要素のコードを生成する。数十件のプロジェクトに対して行った実証実験では、平均で60~70%、最大で90%の開発を自動化したとしている。正式版の提供時期は未定。

https://jitera.app/ja


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

Pydroid3でテトリスを作ってみた。

2023-05-21 08:39:53 | python
 
Python でのテトリスの作り方(サンプルスクリプト付き)

Python でのテトリスの作り方(サンプルスクリプト付き)

Python 勉強がてらに Tkinter を使ってテトリスを作成してみました! 今回はこのテトリスの Python スクリプトの紹介と、このスクリプトの解説をしていきたいと思います。 ...

だえうホームページ

上記のサイトを参考に、ソースコードをそのままコピペしてみたら・・・
import tkinter as tk
import random
 
# 定数
BLOCK_SIZE = 25 # ブロックの縦横サイズpx
FIELD_WIDTH = 10 # フィールドの幅
FIELD_HEIGHT = 20 # フィールドの高さ
 
MOVE_LEFT = 0 # 左にブロックを移動することを示す定数
MOVE_RIGHT = 1 # 右にブロックを移動することを示す定数
MOVE_DOWN = 2 # 下にブロックを移動することを示す定数
 
# ブロックを構成する正方形のクラス
class TetrisSquare():
def __init__(self, x=0, y=0, color="gray"):
'1つの正方形を作成'
self.x = x
self.y = y
self.color = color
 
def set_cord(self, x, y):
'正方形の座標を設定'
self.x = x
self.y = y
 
def get_cord(self):
'正方形の座標を取得'
return int(self.x), int(self.y)
 
def set_color(self, color):
'正方形の色を設定'
self.color = color
 
def get_color(self):
'正方形の色を取得'
return self.color
 
def get_moved_cord(self, direction):
'移動後の正方形の座標を取得'
 
# 移動前の正方形の座標を取得
x, y = self.get_cord()
 
# 移動方向を考慮して移動後の座標を計算
if direction == MOVE_LEFT:
return x - 1, y
elif direction == MOVE_RIGHT:
return x + 1, y
elif direction == MOVE_DOWN:
return x, y + 1
else:
return x, y
 
# テトリス画面を描画するキャンバスクラス
class TetrisCanvas(tk.Canvas):
def __init__(self, master, field):
'テトリスを描画するキャンバスを作成'
 
canvas_width = field.get_width() * BLOCK_SIZE
canvas_height = field.get_height() * BLOCK_SIZE
 
# tk.Canvasクラスのinit
super().__init__(master, width=canvas_width, height=canvas_height, bg="white")
 
# キャンバスを画面上に設置
self.place(x=25, y=25)
 
# 10x20個の正方形を描画することでテトリス画面を作成
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1,
fill=square.get_color()
)
 
# 一つ前に描画したフィールドを設定
self.before_field = field
 
def update(self, field, block):
'テトリス画面をアップデート'
 
# 描画用のフィールド(フィールド+ブロック)を作成
new_field = TetrisField()
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
color = square.get_color()
 
new_square = new_field.get_square(x, y)
new_square.set_color(color)
 
# フィールドにブロックの正方形情報を合成
if block is not None:
block_squares = block.get_squares()
for block_square in block_squares:
# ブロックの正方形の座標と色を取得
x, y = block_square.get_cord()
color = block_square.get_color()
 
# 取得した座標のフィールド上の正方形の色を更新
new_field_square = new_field.get_square(x, y)
new_field_square.set_color(color)
 
# 描画用のフィールドを用いてキャンバスに描画
for y in range(field.get_height()):
for x in range(field.get_width()):
 
# (x,y)座標のフィールドの色を取得
new_square = new_field.get_square(x, y)
new_color = new_square.get_color()
 
# (x,y)座標が前回描画時から変化ない場合は描画しない
before_square = self.before_field.get_square(x, y)
before_color = before_square.get_color()
if(new_color == before_color):
continue
 
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
# フィールドの各位置の色で長方形描画
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1, fill=new_color
)
 
# 前回描画したフィールドの情報を更新
self.before_field = new_field
 
# 積まれたブロックの情報を管理するフィールドクラス
class TetrisField():
def __init__(self):
self.width = FIELD_WIDTH
self.height = FIELD_HEIGHT
 
# フィールドを初期化
self.squares = []
for y in range(self.height):
for x in range(self.width):
# フィールドを正方形インスタンスのリストとして管理
self.squares.append(TetrisSquare(x, y, "gray"))
 
def get_width(self):
'フィールドの正方形の数(横方向)を取得'
 
return self.width
 
def get_height(self):
'フィールドの正方形の数(縦方向)を取得'
 
return self.height
 
def get_squares(self):
'フィールドを構成する正方形のリストを取得'
 
return self.squares
 
def get_square(self, x, y):
'指定した座標の正方形を取得'
 
return self.squares[y * self.width + x]
 
def judge_game_over(self, block):
'ゲームオーバーかどうかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# ブロックがある座標の集合作成
block_cord = set(square.get_cord() for square
in block.get_squares())
 
# ブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & block_cord
 
# 積集合が空であればゲームオーバーではない
if len(collision_set) == 0:
ret = False
else:
ret = True
 
return ret
 
def judge_can_move(self, block, direction):
'指定した方向にブロックを移動できるかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# 移動後のブロックがある座標の集合作成
move_block_cord = set(square.get_moved_cord(direction) for square
in block.get_squares())
 
# フィールドからはみ出すかどうかを判断
for x, y in move_block_cord:
 
# はみ出す場合は移動できない
if x < 0 or x >= self.width or \
y < 0 or y >= self.height:
return False
 
# 移動後のブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & move_block_cord
 
# 積集合が空なら移動可能
if len(collision_set) == 0:
ret = True
else:
ret = False
 
return ret
 
def fix_block(self, block):
'ブロックを固定してフィールドに追加'
 
for square in block.get_squares():
# ブロックに含まれる正方形の座標と色を取得
x, y = square.get_cord()
color = square.get_color()
 
# その座標と色をフィールドに反映
field_square = self.get_square(x, y)
field_square.set_color(color)
 
def delete_line(self):
'行の削除を行う'
 
# 全行に対して削除可能かどうかを調べていく
for y in range(self.height):
for x in range(self.width):
# 行内に1つでも空があると消せない
square = self.get_square(x, y)
if(square.get_color() == "gray"):
# 次の行へ
break
else:
# break されなかった場合はその行は空きがない
# この行を削除し、この行の上側にある行を1行下に移動
for down_y in range(y, 0, -1):
for x in range(self.width):
src_square = self.get_square(x, down_y - 1)
dst_square = self.get_square(x, down_y)
dst_square.set_color(src_square.get_color())
# 一番上の行は必ず全て空きになる
for x in range(self.width):
square = self.get_square(x, 0)
square.set_color("gray")
 
# テトリスのブロックのクラス
class TetrisBlock():
def __init__(self):
'テトリスのブロックを作成'
 
# ブロックを構成する正方形のリスト
self.squares = []
 
# ブロックの形をランダムに決定
block_type = random.randint(1, 4)
 
# ブロックの形に応じて4つの正方形の座標と色を決定
if block_type == 1:
color = "red"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
[FIELD_WIDTH / 2, 3],
]
elif block_type == 2:
color = "blue"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
]
elif block_type == 3:
color = "green"
cords = [
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
]
elif block_type == 4:
color = "orange"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
[FIELD_WIDTH / 2 - 1, 2],
]
 
# 決定した色と座標の正方形を作成してリストに追加
for cord in cords:
self.squares.append(TetrisSquare(cord[0], cord[1], color))
 
def get_squares(self):
'ブロックを構成する正方形を取得'
 
# return [square for square in self.squares]
return self.squares
 
def move(self, direction):
'ブロックを移動'
 
# ブロックを構成する正方形を移動
for square in self.squares:
x, y = square.get_moved_cord(direction)
square.set_cord(x, y)
 
# テトリスゲームを制御するクラス
class TetrisGame():
 
def __init__(self, master):
'テトリスのインスタンス作成'
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックをセット
self.block = None
 
# テトリス画面をセット
self.canvas = TetrisCanvas(master, self.field)
 
# テトリス画面アップデート
self.canvas.update(self.field, self.block)
 
def start(self, func):
'テトリスを開始'
 
# 終了時に呼び出す関数をセット
self.end_func = func
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックを新規追加
self.new_block()
 
def new_block(self):
'ブロックを新規追加'
 
# 落下中のブロックインスタンスを作成
self.block = TetrisBlock()
 
if self.field.judge_game_over(self.block):
self.end_func()
print("GAMEOVER")
 
# テトリス画面をアップデート
self.canvas.update(self.field, self.block)
 
def move_block(self, direction):
'ブロックを移動'
 
# 移動できる場合だけ移動する
if self.field.judge_can_move(self.block, direction):
 
# ブロックを移動
self.block.move(direction)
 
# 画面をアップデート
self.canvas.update(self.field, self.block)
 
else:
# ブロックが下方向に移動できなかった場合
if direction == MOVE_DOWN:
# ブロックを固定する
self.field.fix_block(self.block)
self.field.delete_line()
self.new_block()
 
# イベントを受け付けてそのイベントに応じてテトリスを制御するクラス
class EventHandller():
def __init__(self, master, game):
self.master = master
 
# 制御するゲーム
self.game = game
 
# イベントを定期的に発行するタイマー
self.timer = None
 
# ゲームスタートボタンを設置
button = tk.Button(master, text='START', command=self.start_event)
button.place(x=25 + BLOCK_SIZE * FIELD_WIDTH + 25, y=30)
 
def start_event(self):
'ゲームスタートボタンを押された時の処理'
 
# テトリス開始
self.game.start(self.end_event)
self.running = True
 
# タイマーセット
self.timer_start()
 
# キー操作入力受付開始
self.master.bind("", self.left_key_event)
self.master.bind("", self.right_key_event)
self.master.bind("", self.down_key_event)
 
def end_event(self):
'ゲーム終了時の処理'
self.running = False
 
# イベント受付を停止
self.timer_end()
self.master.unbind("")
self.master.unbind("")
self.master.unbind("")
 
def timer_end(self):
'タイマーを終了'
 
if self.timer is not None:
self.master.after_cancel(self.timer)
self.timer = None
 
def timer_start(self):
'タイマーを開始'
 
if self.timer is not None:
# タイマーを一旦キャンセル
self.master.after_cancel(self.timer)
 
# テトリス実行中の場合のみタイマー開始
if self.running:
# タイマーを開始
self.timer = self.master.after(1000, self.timer_event)
 
def left_key_event(self, event):
'左キー入力受付時の処理'
 
# ブロックを左に動かす
self.game.move_block(MOVE_LEFT)
 
def right_key_event(self, event):
'右キー入力受付時の処理'
 
# ブロックを右に動かす
self.game.move_block(MOVE_RIGHT)
 
def down_key_event(self, event):
'下キー入力受付時の処理'
 
# ブロックを下に動かす
self.game.move_block(MOVE_DOWN)
 
# 落下タイマーを再スタート
self.timer_start()
 
def timer_event(self):
'タイマー満期になった時の処理'
 
# 下キー入力受付時と同じ処理を実行
self.down_key_event(None)
 
 
class Application(tk.Tk):
def __init__(self):
super().__init__()
 
# アプリウィンドウの設定
self.geometry("400x600")
self.title("テトリス")
 
# テトリス生成
game = TetrisGame(self)
 
# イベントハンドラー生成
EventHandller(self, game)
 
 
def main():
'main関数'
 
# GUIアプリ生成
app = Application()
app.mainloop()
 
 
if __name__ == "__main__":
main()








ガーン( ̄▽ ̄;)😱
 
十字キーや回転ボタンがないやんけwww
6段積み重なって即死www
 
しかもブロックが3種類しかないらしいwww
 
ちなみにPCでやっても回転ボタンが無いからご覧の通り、死亡www
 

Pydroid3でChatGPTのようなソースコードジェネレータAIを作るには?

2023-05-21 03:02:58 | ChatGPT
Title:「Pydroid3でソースコードジェネレータAI作成」

《前書き》
今回は、抱負を語ってみたのだが、ChatGPTから励ましのメッセージがあったので公開してみた。

《質問》
AndroidアプリのPydroid3でChatGPTのようなソースコードジェネレータAIを作りたい。

《ChatGPT》
素晴らしいアイデアです!Pydroid3を使用してChatGPTのようなソースコードジェネレータAIを作成することは可能です。ただし、GPT-3.5のような大規模なモデルを完全に再現することは困難です。しかし、基本的な会話やソースコードの生成を行う小規模なAIを作成することは可能です。

以下に、Pydroid3でソースコードジェネレータAIを作成するための基本的な手順を示します。

Pydroid3のインストール: Google PlayストアからPydroid3をインストールしてください。これはAndroid上でPythonを実行するためのアプリです。

必要なライブラリのインストール: Pydroid3を開き、必要なPythonライブラリ(たとえば、tensorflowやnumpyなど)をインストールしてください。これらのライブラリはAIモデルの作成や学習に使用されます。

AIモデルの作成: PythonでAIモデルを作成します。一般的な方法は、深層学習フレームワーク(たとえば、TensorFlowやPyTorch)を使用してニューラルネットワークモデルを構築することです。言語モデルの場合、リカレントニューラルネットワーク(RNN)やトランスフォーマーを使用することが一般的です。

モデルの学習: データセットを用意し、AIモデルを学習させます。学習データは、ソースコードの例や会話のデータなどを含むことができます。大規模なデータセットを使用することで、より良い結果が得られる場合があります。

インタラクティブなインターフェースの作成: Pydroid3上で、AIモデルにユーザーの入力を与え、AIの応答を取得するインタラクティブなインターフェースを作成します。ユーザーからの入力をAIモデルに渡し、返されたソースコードを表示することができます。

これらの手順は、基本的なソースコードジェネレータAIを作成するための一般的な手法です。ただし、実際の実装は詳細にわたりますし、モデルの性能は学習データやモデルのアーキテクチャ、ハイパーパラメータの選択によっても異なります。また、モデルの学習には時間と計算リソースが必要です。Pydroid3はモバイルデバイス上で実行されるため、大規模なモデルや大規模なデータセットの学習は制限されるかもしれません。

さらに、GPT-3.5のような高度なAIモデルを完全に再現することは、Pydroid3上での制約から考えると困難です。GPT-3.5は、巨大なモデルであり、大量の計算リソースと専用のハードウェアが必要です。そのため、Pydroid3上で同等の性能を持つモデルを作成することは難しいでしょう。

しかし、Pydroid3上で動作する小規模なソースコードジェネレータAIを作成することは十分に可能です。適切なモデルの選択、学習データの準備、適切なハイパーパラメータの調整などを行うことで、Pydroid3上で効果的なソースコードジェネレータAIを作成することができます。

最後に、Pydroid3はPythonの実行環境であり、AIモデルを作成するためのツールやライブラリが利用できることを覚えておいてください。適切なライブラリを使用することで、モデルの構築や学習、インタラクティブなインターフェースの作成を支援することができます。

以上の手順と考慮事項を踏まえて、Pydroid3上でのソースコードジェネレータAIの開発を開始することができます。順を追って進めていき、必要なリソースやツールを活用しながら、目標に向かって進んでください。


VisualBasicApplicationのソースコードを生成する専用のソースコードジェネレータAIならどうかな?

ChatGPT
Visual Basic Application(VBA)のソースコードを生成する専用のソースコードジェネレータAIを作成することも可能です。VBAは、Microsoft Office製品(Excel、Word、Accessなど)で使用されるマクロ言語です。VBAを使用して自動化やカスタマイズを行う際に、ソースコードジェネレータAIは効果的なツールとなるでしょう。

以下は、VBAソースコードジェネレータAIを作成する基本的な手順です。

データセットの収集: VBAのソースコード例や関連するドキュメントを収集し、学習データセットを作成します。VBAマクロの機能やパターンを網羅的にカバーするようなデータセットが重要です。

モデルの選択: VBAソースコードを生成するためのAIモデルを選択します。一般的な選択肢としては、リカレントニューラルネットワーク(RNN)やトランスフォーマーを用いたシーケンスモデルが考えられます。

モデルの構築と学習: 選択したモデルを構築し、収集したデータセットを使用して学習を行います。学習データセットからVBAソースコードのパターンを学習することで、モデルはソースコードの生成に使用される予測モデルを作成します。

インタラクティブなインターフェースの作成: ユーザーがVBAの目的や要件を指定できるインタラクティブなインターフェースを作成します。ユーザーからの入力に基づいて、AIモデルはカスタムVBAコードを生成し、必要な機能を持つマクロを提案します。

コード生成の精度と改善: 初期のバージョンのAIモデルでは、生成されるコードの品質や正確性に制約があるかもしれません。ユーザーフィードバックを収集し、AIモデルを改善するための追加の学習や調整を行います。

VBAソースコードジェネレータAIの開発には、VBAの文法や特定のOffice製品のAPIに関する知識が重要です。また、Pydroid3の制約やリソースの制限にも留意する必要があります。しかし、適切なデータセットの収集と品質管理、適切なモデルの選択、モデルの構築と学習、インタラクティブなインターフェースの作成、コード生成の精度向上など、これらの手順を順を追って進めることで、VBAソースコードジェネレータAIを開発できます。

Pydroid3上でVBAソースコードジェネレータAIを作成する際には、以下の点に留意してください。

ライブラリの選択: VBAソースコードジェネレータAIのために必要なライブラリやモジュールを選択し、Pydroid3にインストールします。たとえば、TensorFlowやKerasなどの機械学習ライブラリを使用することができます。

モデルの適合性: 選択したモデルがPydroid3上で動作することを確認してください。Pydroid3はリソース制約があるため、大規模なモデルや高度なモデルには制限があります。リソース制約を考慮しながら、VBAソースコードを効果的に生成できるモデルを選択してください。

パフォーマンスの最適化: モデルの学習と推論のパフォーマンスを最適化するために、Pydroid3上でのリソースの効率的な利用やコードの最適化に取り組むことが重要です。モデルのサイズや複雑さ、データの前処理などを調整し、実行時間やメモリ使用量を最小限に抑えるようにします。

ユーザビリティの向上: VBAソースコードジェネレータAIのインターフェースを使いやすくし、ユーザーが簡単に要件や目的を指定できるようにします。適切な入力フォーマットやフィードバックの仕組みを提供することで、ユーザビリティを向上させます。

VBAソースコードジェネレータAIの開発は、VBAの知識やAIモデリングのスキルが必要となるため、関連するリソースやチュートリアルにアクセスすることをお勧めします。また、AIモデルの訓練には十分なデータセットが必要ですので、データセットの収集には、VBAのソースコード例や既存のマクロ、Office製品のドキュメント、フォーラムやコミュニティの質問と回答などが役立ちます。これらの情報源から多様なVBAコードの例を集め、学習データセットを構築します。ソースコードの品質やバグの有無に注意しながら、データセットを検証・クリーニングすることも重要です。

モデルの学習には、適切なアーキテクチャやハイパーパラメータの選択が必要です。VBAのソースコードジェネレータAIにおいては、シーケンスモデル(RNNやトランスフォーマー)を使用することが一般的です。データセットをモデルに適切に入力し、適切な出力を生成できるように学習させます。モデルの学習には時間と計算リソースが必要ですので、Pydroid3上での制約に注意しながらトレーニングを行ってください。

インタラクティブなインターフェースの開発には、ユーザーが要件や目的を指定できるようにすることが重要です。例えば、ユーザーが必要な機能や処理の説明を入力し、AIモデルがそれに基づいてVBAコードを生成するようなインタフェースを作成します。ユーザビリティを向上させるために、エラーハンドリングや適切な入力検証、生成されたコードの確認機能なども実装することが望ましいです。

開発プロセスでは、ユーザーフィードバックを収集し、モデルとインターフェースの改善に取り組むことも重要です。ユーザーのニーズや利用状況に応じてモデルを調整し、より高品質なVBAソースコードの生成が可能になるようにします。

以上が、VBAソースコードジェネレータAIをPydroid3上で開発するための基本的な手順です。実装に際しては、関連するリソースやライブラリの活用、データセットの品質管理、適切なモデル選択、インタラクティブなインターフェースの開発、ユーザーフィードバックの収集とモデルの改善に注力することが重要です。また、VBAの特定のニーズや使用状況に合わせてカスタマイズされたコード生成を行うことも検討してください。たとえば、特定のOfficeアプリケーション(Excel、Word、Accessなど)や特定の操作(データ処理、グラフ作成、レポート生成など)に特化したコード生成を行うことができます。

また、VBAソースコードジェネレータAIの開発には、VBAの文法や機能に関する深い理解が必要です。VBAのマクロ記述方法、オブジェクトモデル、イベント処理などの知識を持つことで、より優れたAIモデルを開発することができます。

最後に、Pydroid3上でのVBAソースコードジェネレータAIの開発は、多くの時間と努力を必要とするプロジェクトです。適切なリソースを確保し、スキルや知識を習得するために十分な準備を行ってください。オンラインのコミュニティやフォーラム、関連する書籍やチュートリアルなどの情報源を活用しながら、順を追って開発を進めていくことをお勧めします。

VBAソースコードジェネレータAIの開発において、必要なスキルやリソースに関する具体的な情報を提供するためには、開発の詳細や要件についてより具体的な情報を教えていただく必要があります。具体的な要件や目標をお知らせいただければ、より具体的なアドバイスを提供できます。

Autolisp専用のMicro Github Copilot擬きを作ったwww

2023-05-20 02:34:49 | python
Github Copilotのように# コメント文 を入力するだけで目的のAutolispソースコードを生成するAIチャットボットをPythonで作りたい。ソースコードの例を書いて。

ChatGPT
Autolispのソースコードを生成するAIチャットボットの例を以下に示します。この例では、コメント文から簡単
Autolispのソースコードを生成するAIチャットボットの例を以下にまとめます。


def generate_autolisp_code_from_comment(comment):
# 図形タイプの抽出
shape = ""
if "円" in comment:
shape = "円"
elif "四角形" in comment:
shape = "四角形"
else:
return "サポートされていない図形です。"

# ソースコードの生成
if shape == "円":
code = """
(setq pt (getpoint " 中心点を指定してください:"))
(setq radius (getdist " 半径を指定してください:"))

(command "circle" pt radius)
"""
elif shape == "四角形":
code = """
(setq pt1 (getpoint " 第1角の点を指定してください:"))
(setq pt2 (getpoint " 第2角の点を指定してください:"))

(command "rectang" pt1 pt2)
"""
else:
return "サポートされていない図形です。"

return code

# ユーザーのコメントを受け取る
user_comment = input("コメント文を入力してください: ")

# ソースコードの生成と出力
generated_code = generate_autolisp_code_from_comment(user_comment)
print("生成されたAutolispコード: ", generated_code)
この例では、generate_autolisp_code_from_comment関数がコメント文からAutolispの図形描画コードを生成します。関数はコメント文から図形タイプ(円または四角形)を抽出し、それに基づいて新しいソースコードを生成します。生成されたソースコードは文字列として返されます。

メインの処理では、ユーザーにコメント文を入力してもらい、それをgenerate_autolisp_code_from_comment関数に渡して生成されたAutolispコードを取得します。最後に、生成されたコードを出力します。

例えば、ユーザーが「円を描画」というコメントを入力した場合、次のようなAutolispコードが生成されます。

lisp
Copy code
(setq pt (getpoint " 中心点を指定してください:"))
(setq radius (getdist " 半径を指定してください:"))

(command "circle" pt radius)
Autolispでは、getpoint関数を使用してユーザーに点を指定させ、getdist関数を使用してユーザーに半径を指定させています。その後、command関数を使用して円を描画しています。



ChatGPTよ、でかしたぞwww
モノホンのGithub CopilotはガチのAIでトレーニングしていくのだが、こちとら手動でチマチマと機能を追加していく有り様だwww