LoginSignup
0
0

三角柱 「2009 熊本県立大学前期【1】」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2023-08-18

・久しぶり?の3次元CADマクロでした。(途中2D→3Dへ代入)

オリジナル

上と同じです。大学入試数学問題集成 様>テキスト 【1】

sympyで(T氏の数学日記 様の方法で)

勉強中。正弦定理,余弦定理,ヘロンの公式。

sympyで(ベクトルの2D成分表示?です。)

・仮ABCの内心を座標原点へ移動しました。

from sympy import *
def myTriangle_Move_IncenterToOrigin_Point(dumABC):
    dumO=dumABC.incenter
    myT=Triangle( dumABC.vertices[0]-dumO,
                  dumABC.vertices[1]-dumO,
                  dumABC.vertices[2]-dumO )
    return myT.args[0],myT.args[1],myT.args[2]
# def myCheck(A,B,C):
#     return A.distance(B),B.distance(C),C.distance(A)
(AB,BC,CA)=(4,5,6)
(O),(A,B,C)=(Point(0,0)),( myTriangle_Move_IncenterToOrigin_Point  ( Triangle(sss=(AB,BC,CA) ) )  )
# print(myCheck(A,B,C) )
print("#1)",Triangle(A,B,C).area)
print("#2)",Circle  (A,B,C).area)
print("#3)",Triangle(A,B,C).inradius*2)
#1) 15*sqrt(7)/4
#2) 64*pi/7
#3) sqrt(7)

FreeCADのマクロで作図

・久しぶり?の3次元CADマクロでした。(途中2D→3Dへ代入)
・三角柱でありません。ワイヤーフレームです。勉強中。

import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
def myTriangle_Move_IncenterToOrigin_Point(dumABC):
    dumO=dumABC.incenter
    myT=Triangle( dumABC.vertices[0]-dumO,
                  dumABC.vertices[1]-dumO,
                  dumABC.vertices[2]-dumO )
    return myT.args[0],myT.args[1],myT.args[2]
# def myCheck(A,B,C):
#     return A.distance(B),B.distance(C),C.distance(A)
(AB,BC,CA)=(4,5,6)
(O),(A,B,C)=(Point(0,0)),( myTriangle_Move_IncenterToOrigin_Point  ( Triangle(sss=(AB,BC,CA) ) )  )
# print(myCheck(A,B,C) )
print("#1)",Triangle(A,B,C).area)
print("#2)",Circle  (A,B,C).area)
print("#3)",Triangle(A,B,C).inradius*2)
#1) 15*sqrt(7)/4
#2) 64*pi/7
#3) sqrt(7)
##########################################################################################################
### 3D作図
def my2D_3D(myP):
   return Point3D(myP.x,myP.y,0)
O_3D=my2D_3D(O)
A_3D=my2D_3D(A)
B_3D=my2D_3D(B)
C_3D=my2D_3D(C)
r_3D=Triangle(A,B,C).inradius
#
A2_3D=A_3D+Point(0,0,r_3D*2)
B2_3D=B_3D+Point(0,0,r_3D*2)
C2_3D=C_3D+Point(0,0,r_3D*2)
##########################################################################################################
### 3D作図
def my_Sphere(myx,myy,myz,myr):
    print("sssssssssssss",myx,myy,myz,myr)
    sphere = doc.addObject("Part::Sphere", "mySphere2")
    #sphere.Radius =   1
    sphere.Radius = float(myr)
    sphere.Angle1 = -90
    sphere.Angle2 =  90
    sphere.Angle3 = 360
    sphere.Placement = App.Placement(App.Vector(float(myx),float(myy),float(myz)), App.Rotation(0, 90, 0))
    FreeCADGui.getDocument('Unnamed').getObject('mySphere2').Transparency = 90
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxtXYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.7 mm'
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.4 mm'
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
def myLine_S(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    return 0
def myTxtXYZ_S(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt(xy_tx[2*i-2]) ) 
    return
def myLine_C(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    myLine(args[i],args[0])
    return
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
def my_Circle(x,y,z,a):
    zaxis = App.Vector(0, 0, 1)
    p5 = App.Vector(float(x),float(y),float(z))
    place5 = App.Placement(p5, App.Rotation(zaxis, 0))
    circle5 = Draft.make_circle(float(a), placement=place5)
    return 
#################################################################################
doc = App.activeDocument()
my_Sphere ( O_3D.x,O_3D.y, O_3D.z+r_3D ,r_3D )
myTxtXYZ_S( O_3D,"O",A_3D,"A",B_3D,"B",C_3D,"C"       )
myLine_C  ( A_3D, B_3D ,C_3D)
myLine_C  (A2_3D,B2_3D,C2_3D)
myLine_S  ( A_3D,A2_3D )
myLine_S  ( B_3D,B2_3D )
myLine_S  ( C_3D,C2_3D )
#################################################################################
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

isometric方向?です。

0png.png

isometric方向?です。
マウス操作で、Originは、非表示。
緑色は、マウス操作です。着色方法を勉強中

1png.png

上空から?です。

2png.png

sympyの実行環境

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
??? タブレット環境で、コピー貼り付けが実行できませんでした。???

参考

以下、いつもの?おすすめです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0