CyberChaos(さいばかおす)

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

通り芯作成プログラムの改造(通り芯の交点から中心をオフセットさせた基礎の表示)

2023-08-16 22:00:26 | python
通り芯作成プログラムをさらに改造したい。
一旦通り芯を作成したファイルを保存し、次にそのファイルを再度開き、通り芯の交点の座標を取得する。次にそれぞれの交点に一対一に対応した長方形の基礎を表示させることにする。
任意の通り芯の交点をXnYm(n,mは通り芯の番号)で表し、交点からx軸方向へa、y軸方向へb長方形の中心をオフセットさせる。基礎の橫の長さをp,縦の長さをqとする。
n,m,a,b,p,qの数値をボックスに入力させ、作成された通り芯ファイルを読み込んで上書き更新して基礎の長方形も加えて表示させることにする。






#通り芯の交点を入力してファイルに保存させるクラス
import tkinter as tk
import pickle
 
class IntersectionEditor:
def __init__(self, root):
self.root = root
self.root.title("Intersection Editor")
 
self.intersections = {}
 
self.canvas = tk.Canvas(self.root, width=400, height=400)
self.canvas.pack()
 
self.save_button = tk.Button(self.root, text="Save Intersections", command=self.save_intersections)
self.save_button.pack()
 
self.load_button = tk.Button(self.root, text="Load Intersections", command=self.load_intersections)
self.load_button.pack()
 
self.add_intersection(100, 100) # Example initial intersection
 
def add_intersection(self, x, y):
self.canvas.create_oval(x-2, y-2, x+2, y+2, fill="red")
intersection_id = f"X{x}Y{y}"
self.intersections[intersection_id] = {"x": x, "y": y}
 
def save_intersections(self):
with open("intersections.pkl", "wb") as file:
pickle.dump(self.intersections, file)
 
def load_intersections(self):
with open("intersections.pkl", "rb") as file:
self.intersections = pickle.load(file)
for intersection_id, data in self.intersections.items():
self.add_intersection(data["x"], data["y"])
 
root = tk.Tk()
app = IntersectionEditor(root)
root.mainloop()
 
#保存された通り芯ファイルを読み込み、各交点に対応する長方形の基礎を表示するクラス
import tkinter as tk
from tkinter import simpledialog
import pickle
 
class FoundationPlotter:
def __init__(self, root):
self.root = root
self.root.title("Foundation Plotter")
 
self.canvas = tk.Canvas(self.root, width=400, height=400)
self.canvas.pack()
 
self.load_button = tk.Button(self.root, text="Load Intersections", command=self.load_intersections)
self.load_button.pack()
 
self.draw_button = tk.Button(self.root, text="Draw Foundations", command=self.draw_foundations)
self.draw_button.pack()
 
self.intersections = {}
self.foundation_params = {}
 
def load_intersections(self):
with open("intersections.pkl", "rb") as file:
self.intersections = pickle.load(file)
 
def draw_foundations(self):
for intersection_id, data in self.intersections.items():
x = data["x"]
y = data["y"]
if intersection_id not in self.foundation_params:
self.ask_foundation_params(intersection_id)
 
params = self.foundation_params[intersection_id]
a, b, p, q = params["a"], params["b"], params["p"], params["q"]
 
x1 = x - a
y1 = y - b
x2 = x1 + p
y2 = y1 + q
 
self.canvas.create_rectangle(x1, y1, x2, y2, outline="blue", width=2)
 
def ask_foundation_params(self, intersection_id):
params = {}
params["a"] = simpledialog.askinteger("Foundation Parameters", f"Enter a for {intersection_id}:")
params["b"] = simpledialog.askinteger("Foundation Parameters", f"Enter b for {intersection_id}:")
params["p"] = simpledialog.askinteger("Foundation Parameters", f"Enter p for {intersection_id}:")
params["q"] = simpledialog.askinteger("Foundation Parameters", f"Enter q for {intersection_id}:")
 
self.foundation_params[intersection_id] = params
 
root = tk.Tk()
app = FoundationPlotter(root)
root.mainloop()
 
中心がオフセットされた基礎らしきものは表示したが、通り芯は表示されなかった。
 
最後にmain(本体)プログラムを示す。
 
以下が、各クラスを統合して読み込み、実行するmainプログラムの本体のコード例です。
import tkinter as tk from tkinter import simpledialog import pickle class IntersectionEditor: # ... (省略) ... class FoundationPlotter: # ... (省略) ... class MainApp: def __init__(self, root): self.root = root self.root.title("Main Application") self.intersection_editor = IntersectionEditor(self.root) self.foundation_plotter = FoundationPlotter(self.root) self.load_editor_button = tk.Button(self.root, text="Open Intersection Editor", command=self.open_editor) self.load_editor_button.pack(pady=10) self.load_plotter_button = tk.Button(self.root, text="Open Foundation Plotter", command=self.open_plotter) self.load_plotter_button.pack(pady=10) def open_editor(self): self.intersection_editor.root.deiconify() # Show the Intersection Editor window def open_plotter(self): self.foundation_plotter.root.deiconify() # Show the Foundation Plotter window root = tk.Tk() app = MainApp(root) root.mainloop()
 

このMainAppクラスは、IntersectionEditorFoundationPlotterの各クラスを統合し、それぞれのウィンドウを開くためのボタンを提供します。MainAppを実行することで、メインアプリケーションが起動し、IntersectionEditorFoundationPlotterのウィンドウを開くことができます。

各クラスのコードは、以前提供したものを利用してください。プログラムの一部は省略されているため、必要に応じて適宜追加・調整を行ってください。

ちなみにspiderでは
こんな風に出力された。
 
 
オフセットされた基礎が1種類しか表示されていない。
(※通り芯6本とそれぞれの交点に対する中心がオフセットされた任意の寸法の基礎の表示を求めたのだが・・・)
まあ、ここまでできれば上等かな?
 

通り芯作成プログラムをフローティングウィンドウ形式に改造してみた

2023-08-16 21:28:31 | python











import tkinter as tk
from tkinter import ttk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt

class BalloonAndCrosshairsApp:
def __init__(self, root):
self.root = root
self.root.title("Main Window")
self.show_input_button = tk.Button(root, text="Show Input Form", command=self.show_input_form)
self.show_input_button.pack(padx=10, pady=10)
self.input_window = None
self.x_entry = None
self.y_entry = None
self.points = []
def show_input_form(self):
self.input_window = tk.Toplevel(self.root)
self.input_window.title("Coordinate Input")
self.x_label = tk.Label(self.input_window, text="X:")
self.x_label.grid(row=0, column=0, padx=5, pady=5)
self.x_entry = tk.Entry(self.input_window)
self.x_entry.grid(row=0, column=1, padx=5, pady=5)
self.y_label = tk.Label(self.input_window, text="Y:")
self.y_label.grid(row=1, column=0, padx=5, pady=5)
self.y_entry = tk.Entry(self.input_window)
self.y_entry.grid(row=1, column=1, padx=5, pady=5)
self.add_button = tk.Button(self.input_window, text="Add Point", command=self.add_point)
self.add_button.grid(row=2, columnspan=2, padx=5, pady=5)
self.plot_button = tk.Button(self.input_window, text="Plot Points", command=self.plot_points)
self.plot_button.grid(row=3, columnspan=2, padx=5, pady=5)
def add_point(self):
x = float(self.x_entry.get())
y = float(self.y_entry.get())
self.points.append((x, y))
self.x_entry.delete(0, tk.END)
self.y_entry.delete(0, tk.END)
def plot_points(self):
if not self.points:
return
plot_window = tk.Toplevel(self.root)
plot_window.title("Plot")
x_coordinates = set()
y_coordinates = set()

for x, y in self.points:
x_coordinates.add(x)
y_coordinates.add(y)

fig = Figure(figsize=(5, 4))
ax = fig.add_subplot(111)

balloon_counter = 1
for y in y_coordinates:
for x in x_coordinates:
ax.plot(x, y, 'o', label=f'X{balloon_counter}')
balloon_counter += 1

for y in y_coordinates:
ax.axhline(y, color='red', linestyle='--')

for x in x_coordinates:
ax.axvline(x, color='blue', linestyle='--')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True)

canvas = FigureCanvasTkAgg(fig, master=plot_window)
canvas.get_tk_widget().pack()

root = tk.Tk()
app = BalloonAndCrosshairsApp(root)
root.mainloop()

Pydroidだと表示されたウィンドウをいじれない。

長さ45mm、M12×1.25の六角頭のボルトを自動で作図するPythonプログラム

2023-08-16 09:25:26 | python
長さ45mm、M12×1.25の六角頭のボルトを自動で作図するPythonプログラムを書いて
とChatGPT に頼んだら・・・www





import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

def draw_3d_hex_bolt():
bolt_length = 45 # ボルトの長さ (mm)
bolt_diameter = 12 # ボルトの直径 (mm)
thread_pitch = 1.25 # ボルトのピッチ (mm)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# ボルトの六角頭部を描画
bolt_head = np.array([
[0, 0, bolt_length + bolt_diameter],
[bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, bolt_length + bolt_diameter],
[0, bolt_diameter, bolt_length + bolt_diameter],
[-bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, bolt_length + bolt_diameter]
])
head_poly = [[bolt_head[0], bolt_head[1], bolt_head[2], bolt_head[3]]]
ax.add_collection3d(Poly3DCollection(head_poly, color='black'))
# ボルトのスレッドを描画
thread_radius = bolt_diameter / 2
for i in range(int(bolt_length / thread_pitch)):
y = i * thread_pitch
theta = np.linspace(0, 2 * np.pi, 20)
x = thread_radius * np.cos(theta)
z = y + thread_radius * np.sin(theta)
ax.plot(x, y * np.ones_like(x), z, color='black')
# スレッドの片側の先端に六角頭を描画
thread_tip = np.array([
[0, 0, 0],
[bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, 0],
[0, bolt_diameter, 0],
[-bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, 0]
])
tip_poly = [[thread_tip[0], thread_tip[1], thread_tip[2], thread_tip[3]]]
ax.add_collection3d(Poly3DCollection(tip_poly, color='black'))
# グラフの設定
ax.set_xlim(-bolt_diameter, bolt_diameter)
ax.set_ylim(0, bolt_length)
ax.set_zlim(0, bolt_length + bolt_diameter)
ax.set_xlabel('Width (mm)')
ax.set_ylabel('Length (mm)')
ax.set_zlabel('Height (mm)')
ax.set_title('3D Hex Bolt Drawing')
plt.show()

draw_3d_hex_bolt()

おい、何回直せと命令しても六角形の頭は描けないし、変な所に変な形の物がついているのは直せないんだな?www


客先常駐c++プログラマーが転職を成功するには?

2023-08-16 06:46:27 | C / Visual C++
Quoraの問答より引用。

※ポイント
①英語の技術ドキュメントが読めて、メールのやりとりができ、ソースコードのコメントが英語で書けるレベルの英語力
②プラットホームエンジニア
③オブジェクト指向、UMLを使った分析手法、アナリシスト

その歳、その世代でC++ができるのは、まさに貴重です。オブジェクト指向が身についているというも貴重です。C、C++に拘らず、それを活かせる分野がよいはずです。

プログラミングでは、ぜひ、アプリケーションではなく、プラットフォーム側に挑戦するとよいと思います。業務アプリケーションプログラマーは履いて捨てる程、ごまんといますが、プラットフォームは希少ですから、付加価値があるはずです。流行に流されず、惑わされないことが重要だと思います。

さらに身に着けるべきスキルは、はやり、オブジェクト指向、そして、UMLを使うような分析手法のスキルかと思います。ただのプログラマーは価値が低いですが、分析、アナリシスのスキルをもった、ソフトウェアエンジニアとなると、そう沢山はいません。ぜひ、おかしな、世界に通用しないSEとやらではなく、まっとうなソフトウェアエンジニアを目指しましょうよ。

加えて、英語を身に着けませんか。これは受験英語ではなく活きた英語です。街の英会話教室で、ネィテブ外国人に習えば十分に身に付きます。場所によては、会話にとどまらず、読み書きも教えてくれます。全て英語で書かれた英語を母国語としない人達に向けて作成されたテキストが準備されているはずでし。さらに、この授業料は、雇用保険から補助してくれます。

そもそも、プログラマーが英語ができないというのは、あり得ない事です。ソフトウェア開発の世界は日本が中心ではなく、日本以外の世界が中心です。世界では日本市場などしれていて日本語など眼中にありません。べつに完璧になる必要はなく、英語の技術ドキュメントが読めて、メールのやりとりができ、ソースコードのコメントが英語で書けるレベルで十分です。

現実問題、現状の収入、客先常駐という環境、本来、質問者さんが得るべき報酬の大部分を、ピンハネされ、搾取されています。結果的に自分を安売りしていることに気づいてください。単純に、依頼者が払っている代金がどのくらいで、どれだけ中間マージンを引かれ、その上で、あなたの直接の雇用者が、さらにマージンを引き、最終的に、あなたの報酬はいくらになっているか、調べてばわかるはずです。無知の生真面目は搾取されます。

転職先を探す時は、大手に拘らず、少数精鋭の実は特定分野に特化しているしられざる会社を探すとよいでしょう。日本の大手メーカーやSIerはほぼ外れです。福利厚生や世間のブランドに騙されないでください。今の時代、安定などありません、上場企業でも、スタートアップベンチャーでも、職を失うリスクは同じです。ならば、何処へ行っても通用するスキルを磨くことができる環境を主軸に探した方がいいです。そして合理的に考えて、競争相手は少ない方がいいんです。

年功序列、終身雇用は、今更ながら、やっと壊れつつあります。行く先がダメなら、あるいは、目的のスキルをこれ以上得る見込みがなくなったら、また次を探すという覚悟がいいと思います。就社ではなく就職をり返していく方がいいです。特定の会社にしか通用しないスキルを身に着けるのは時間の無駄で、俗に、潰しの利かない会社員になってします、最後には、組織に捨てられます。会社は道具であると割り切って、下手に骨を埋めるなど考えない方がいいです。自分軸でいきましょう。

最後に、資格云々ですが、よほどの事情、専門性のための必要性がない限り、資格取得は時間の無駄です。資格を取れば門徒が開けるというのは所詮、学校の先生レベルの発想であり、仮にそれが効果があったとしても、資格で足切りするような会社とは所詮そのレベルでしかなく、入ったあとに、後悔することになると思います。