会う:FreeCAD

FreeCADは、3次元モデルとその投影図を作成できるパラメトリック3次元エディターです。

FreeCADの現在のバージョンは0.12ですが、0.13ベータ版をダウンロードしてコンパイルすることもできます。



FreeCADは、インポートとエクスポートの両方でいくつかの異なるドキュメント形式をサポートし、「スクリーンショット」(pdf形式を含む)を保存することもできます。



FreeCADのドキュメントは非常に豊富ですが、それでも私たちが望むほど完全ではありません。 この製品の使用に関する質問は、 FreeCADフォーラムで議論できます。









描画を簡単にするために、FreeCADにはpythonでスクリプトを作成する機能があり、小規模な操作にはpythonコンソールを使用できます。 ただし、コンソールは基本的なものであり、コマンドの履歴はありません。

マルチボリュームFreeCADユーザーガイドを書き直すのではなく、単にそれで何ができるかの例を示します。



しかし、まず、FreeCADのスクリプトを「見る」方法を説明します。 各起動の前に、FreeCADはシステムディレクトリの内容と〜/ .FreeCAD / Mod /ディレクトリを確認します。 そこにあるスクリプト、彼は将来使用します。



FreeCADのスクリプトは2つのカテゴリに分類されます。コマンドラインから呼び出されるスクリプト(スクリプトを開始するには、まずpythonコマンドでそれらを含むインポートモジュールをロードする必要があります)、およびGUIから実行するスクリプト。 reloadコマンドで最初のものをいつでもリロードできますが、2番目のものをリロードするには(ソースに変更を加えた場合)、FreeCADを再起動する必要があります。 最初に、最初の作業を検討してください。



「車輪」を描く



XY平面でスケッチを作成しましょう。その上に、ホイールの「半分」のプロファイルを描画します。







これを行うには、まず、「目で」メインフォームを破線の形で描画します。

次に、適切な場所で面取りをカットします(「フィレット」ツール)。 その後、アンカーポイントを配置します。 出発点を完全に結び付けます。 平行度によって平行オブジェクトを制限し、プロファイルの部分とフィレットの半径の間の距離を設定します。







次に、スケッチの編集を終了し、オブジェクトのリスト(左側)でそれを選択し、[選択したスケッチを回転]ボタンをクリックします。 次のホイールを取得します。







「ディスク」にノッチを作成します。 これを行うには、XZ平面で別のスケッチを作成します。 その中で、セグメントと円弧を切り取ります。 穴を中心に対して正確に対称にするために、2本の見えない線にスナップします。







スケッチを100単位引き出し(ホイールと確実に交差するように)、Y軸に沿って50単位移動します(Plasement.Position):







次に、結果の図形を円で「乗算」して、「ホイール」に切り抜きを作成する必要があります。 「繁殖」のために、スクリプトNCopy.pyを作成します。



import FreeCAD, FreeCADGui, Part from FreeCAD import Base def CopyObj(obj): name = obj.Name shape = obj.Shape newshape = shape.copy() newobject = FreeCAD.ActiveDocument.addObject("Part::Feature",name) newobject.Shape = newshape return newobject def copyCirc(C=Base.Vector(0,0,0), A=Base.Vector(0,0,1), Ang=90, N=4, rot=True, moveOriToGrp=False): Ang %= 360 if (N > 360/Ang or N == 0): N = int(360/Ang) sel = FreeCADGui.Selection.getSelection() if (not sel): FreeCAD.Console.PrintError("Error: you should select some objects") return None doc = FreeCAD.activeDocument() grp = doc.addObject("App::DocumentObjectGroup", "CircularCopy") for Obj in sel: A0 = Ang for i in range (1, N): newobject = CopyObj(Obj) S = newobject.Shape S.rotate(C, A, A0) if (not rot): S.rotate(S.Placement.Base, A, -A0) grp.addObject(newobject) A0 += Ang if (moveOriToGrp): grp.addObject(Obj) return grp
      
      







〜/ .FreeCAD / Mod /のサブディレクトリに保存します。



CopyObj関数には補助的な値があります(これは将来役に立つでしょう):この関数はこのオブジェクトのコピーを作成するだけです。



copyCirc関数には6つの引数があり、すべてにデフォルト値が割り当てられているため、異なる値を持つ引数を指定することによってのみ呼び出すことができます。 彼女の議論は次のとおりです。



円の半径は必要ありません-オブジェクトから円の中心までの距離と考えます。 コピーするオブジェクト[s]は、選択から取得されます。 何も強調表示されていない場合は、エラーテキストを表示して関数を終了します。 次に、関数に「CircularCopy」グループを作成し、選択範囲からすべてのオブジェクトを反復処理し始めます。 それぞれ(N-1)回は円でコピーされ、グループに配置されます。



では、オブジェクトを「乗算」する円の法線は(0,1,0)であり、コピー間の角度を30度に等しくします。中心はデフォルトで(原点に)配置され、円全体を塗りつぶす必要があります。 だから、コマンドを与える必要があります



 import NCopy NCopy.copyCirc(A=App.Vector(0,1,0), N=0, Ang=30, moveOriToGrp=True)
      
      







表示されたグループ「CircularCopy」を公開し、その中のすべてのオブジェクトを選択して結合を実行すると、「Fusion」オブジェクトが表示されます。 次に、Ctrlキーを押して「ホイール」(「革命」)とこのユニオンを選択し、操作「交差点」を選択します。 その結果、「ホイール」にカットアウトが表示されます。







そのため、pdfにエクスポートされた「ホイール」のようになります。





雑多



オブジェクトをコピーするための関数をいくつか追加します。



オブジェクトを指定した場所にコピーします(mvはシフトベクトル、axは回転軸、rotは回転角度です):



 def CopyObjAt(obj, mv=Base.Vector(0,0,0), axe=Base.Vector(0,0,0), rot=0): obj = CopyObj(obj) obj.Placement = FreeCAD.Placement(mv, axe, rot) return obj
      
      







ベクトルVにN回コピーします。



 def copyVec(N=2, V=Base.Vector(0,0,1), moveOriToGrp=False): sel = FreeCADGui.Selection.getSelection() if sel: doc = FreeCAD.activeDocument() grp = doc.addObject("App::DocumentObjectGroup", "VectorCopy") for Obj in sel: R0 = V for i in range (1, N): newobject = CopyObj(Obj) newobject.Shape.translate(R0) grp.addObject(newobject) R0 += V if (moveOriToGrp): grp.addObject(Obj) else: FreeCAD.Console.PrintError("Error: you should select some objects") return grp
      
      







パスに沿ってN回コピー-Bスプライン:



 def copyByTrajectory(N=4): sel = FreeCADGui.Selection.getSelection() def prErr(): FreeCAD.Console.PrintError("Error: you should select a traectory and one object\n") if (not sel): prErr(); return None L = len(sel) if(L != 2): prErr(); return None if(N < 2): FreeCAD.Console.PrintError("Error: N shold be more than 1\n"); return None Traj = sel[0].Shape #(a, b) = Traj.ParameterRange Obj = sel[1] TLen = Traj.Length / (N - 1) curPos = 0 doc = FreeCAD.activeDocument() grp = doc.addObject("App::DocumentObjectGroup", "BSplineCopy") try: for i in range(0, N): v = Traj.valueAt(curPos); curPos += TLen newobj = CopyObjAt(Obj, v) grp.addObject(newobj) except: FreeCAD.Console.PrintError("Error: bad selection\n") return None
      
      







ベアリングを描く



これで、「ホイール」と同様に、ケージなしの単純なベアリングを描画できます。



まず、シェルを描画します。 繰り返しますが、「目で」最初に破線の輪郭を描き、次にそれらの間に円を描き、すぐに非アクティブにします。 次に、図に制限を課します:ポイントの位置、セクションの垂直性と水平性、同じ線の均等性、シェルとボールの表面の溝の1ポイントの接線制限、いくつかの次元を導入します。 その結果、次のスケッチが得られます。







スケッチ編集モードを終了し、一般ビューで選択して、スケッチ回転操作を有効にします。 その結果、次のような素晴らしいものが得られます。







次に、ボールを追加する必要があります。 これを行うには、「球を描く」アイコンをアクティブにして、デフォルトの球を取得します。 それを選択してパラメーターを修正します。半径を15単位に等しくし、位置(Placement.Position)でX座標を58単位に等しくします。 ボールを「乗算」するには、1つのボールの角直径を計算する必要があります。 これを行う最も簡単な方法は、スケッチを再度開くことです(現在は「Revolution」オブジェクトに属します)。 シェルが干渉しないように、シェルを選択してスペースバーを押します-シェルは見えなくなります。 次に、原点からボールにセグメントを描画します。 セグメントの一方の端を厳密に原点に結び付け、2番目の接線をボールに接するように制限します。 このセグメントを選択したら、コーナーの制限を有効にします(もちろん、FreeCADは過剰な数の制限を誓いますが、確認する必要があるだけです)。 したがって、この角度は14.9882度に等しく、およそ15度です。 FreeCADが一般的な言葉で私たちのラムに誓うと返さないように、この制限をすぐに削除してください 。 ボールを選択し、30度ごとに円でそのコピーを配布します。 まぐれによって、前の段落と同様のコマンドを入力する必要があります。



 import NCopy NCopy.copyCirc(A=App.Vector(0,1,0), N=0, Ang=30, moveOriToGrp=True)
      
      







オブジェクトを少し色付けしましょう。 ボールの色付けを簡単にするには、それらを1つのオブジェクトに結合します。 「ビューティー」の場合、オブジェクトの表示スタイルを「フラットライン」から「シェーディング」に変更します。 私が作ったボールの色は「ゴールド」(255、214、0)で、シェルの色は「シルバー」(192、192、192)でした。 GUIではなくコマンドラインで色を変更できます(RGBコンポーネントのみを1つに正規化する必要があります)。 ドキュメントが「ベアリング」と呼ばれる場合、次のようになります。



 FreeCADGui.getDocument("bearing").getObject("Fusion").ShapeColor = (1.00,0.84,0.00) FreeCADGui.getDocument("bearing").getObject("Revolution").ShapeColor = (0.75,0.75,0.75)
      
      







同様に、表示のタイプを変更できます。



 FreeCADGui.getDocument("bearing").getObject("Revolution").DisplayMode = "Shaded" FreeCADGui.getDocument("bearing").getObject("Fusion").DisplayMode = "Shaded"
      
      











そして、図面を作成してSVGにエクスポートできます。







スクリプトの詳細



既に述べたように、FreeCADコンソールからコマンドを実行できるようにするには、これらのコマンドを含むファイル(Pythonモジュール)を〜/ .FreeCAD / Mod /ディレクトリまたはそのサブディレクトリに配置するだけです。 ただし、GUIからコマンド(「ボタン」、「メニュー」など)を実行できるようにするには、もう少し行う必要があります。



最初に、初期化スクリプトInitGui.pyを作成し、スクリプトサブディレクトリに配置する必要があります。 スクリプトディレクトリの内容を表示すると、このFreeCADスクリプトが実行されます。



このファイルの最小内容は次のとおりです。



 class MyWorkbench ( Workbench ): import   Icon =     () MenuText = " " ToolTip = "   " def Initialize(self): # ToolBar list = [     ] self.appendToolbar("  ",list) # Menu list = [     ] self.appendMenu(" ",list) Gui.addWorkbench(MyWorkbench())
      
      







「アイテムのリスト」リストには、ツールキットによって提供されるクラスの名前である文字列変数が含まれます。 したがって、これらのリストの各行に対して、適切なコマンドまたはクラスを作成する必要があります。 タスクバーまたはメニュー項目でサムネイルがアクティブになると、このクラスのコンストラクターが起動され、何らかのアクションが実行されます。 このクラスの最小の内容は次のとおりです。



 class OneAction: def Activated(self): #Initialize import   ,        def GetResources(self): import   IconPath =     (  ) MenuText = "   " ToolTip = "" return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip} FreeCADGui.addCommand(' ', OneAction())
      
      







最後の行は、「項目名」の行がOneActionクラスに対応することをFreeCADに伝えます(したがって、この行をツールキットの初期化クラスのリストに追加します)。



新しいオブジェクトを作成するには、これらのオブジェクト用に個別のクラスを作成する必要があります。 このクラスの最小の内容は次のとおりです。



 class MyObject: def __init__(self, obj, ): ''' Add new properties to partfeature ''' obj.addProperty(" "," ","","").= obj.Proxy = self obj.Shape =    -(obj.ViewObject) def onChanged(self, obj, prop): ,     prop, obj -   -(obj.ViewObject) def execute(self, obj): ,   ""  -(obj.ViewObject)
      
      







プロバイダークラスは、GUIにリソース(アイコンなど)を提供します。



スクリプトの例は、FreeCADリソースディレクトリおよび公式ドキュメントにあります。



最後に、例を挙げます。 最初の例は、コマンドコンソールを使用せずに描かれています。







2番目の例は、レンズを描画できる単純なスクリプトを使用したものです。 これは、彼らが言うように、「一日を失うことは良いが、それから一時間で飛ぶこと」です。 コードは次のとおりです。



 import Lens a=[[8,6,1,6,3], [10,-15,2.5,8,5], [-16,10,0.5,6,7], [-8,-6,0.5,4,3], [3,3,0.2,2,1], [0,0,0.1,1,0.1], [0,3,.3,1]] Lens.makeLensBench(a) b=[[-10,8,0.1,6], [8,16,0.5,6], [16,-9,1,6]] Lens.makeLensBench(b,App.Vector(0,10,0))
      
      







これを取得できます:







ビデオでは、このモデルの外観を確認できます。



興味のある方は、 ここに行っ 、さらに多くの異なる例を参照することをお勧めします。



UPD:これは、フリーケード(クライオスタット)で行われた実際の作業の例です



All Articles