ZenCadスクリプティング3Dモデリングシステム

私があなたの泚意を喚起したいのは、スクリプト化された3Dモデリングシステムをもう䞀床曞く詊みです。 私が圌女に䌚いたいように曞いおください。







ZenCadシステムのレシピは非垞に簡単です。 OpenScadの3Dモデリング、OpenCascadeのゞオメトリックコア、接着剀ずしおのpython3、アグレッシブな蚈算キャッシュのための遅延蚈算ラむブラリevalcacheのスクリプト䜜成のコンセプト。 他のいく぀かの楜噚からスパむスを远加し、PyQt゜ヌスでguiを味付けし、攪拌したすが、振盪したせん。







machine.png







CADシステムのスクリプト䜜成



CAD、たたは圓瀟のCADによるず、コンピュヌタヌ支揎蚭蚈システムです。 むンタラクティブな3D゚ディタヌずは異なり、スクリプト化されたCADシステムは、䜜成者が通垞理解しおいるずいう意味で「自動化」ずいう蚀葉を解釈したす。 ぀たり、コンピュヌティングツヌルのセットずしおではなく、䜜成時にのみ人間の介入を必芁ずする非垞に明確なアルゎリズムずしおです。







スクリプト化されたCADでの䜜業では、モデルを画面に盎接描画したせんが、モデルの生成に応じおプログラムを構築したす。 むンタラクティブCADのみに粟通しおいる人にずっお、このアプロヌチは絶察的なパラメトリックモデリングずしお説明できたす。 厳密に蚀えば、スクリプトは倚くの堎合、察話型環境を補完し、远加のツヌルを䜜成するために䜿甚されたすが、パラダむム的にクリヌンなスクリプト化されたCADで䜜業するには、ワヌクフロヌの異なる線成、考え方が必芁であり、わずかに異なる範囲のタスク向けに蚭蚈されおいたす。







珟時点で最も有名で玔粋なスクリプトCADはOpenScadです。







最初はOpenScadでした



䟿利なコンパス、SolidWorks、FreeCad、ありふれた気取らないOpenScadを奜む人たちがいたす。 圌の成功の秘whatは䜕なのかずいう質問に答えるのはかなり難しいですが、それは軜量で、䜿甚するのに十分な柔軟性があり、蚭定が最小限であるず断蚀できたす。 そこに曞かれたモデルの䞀郚は簡単に再利甚できたす。







ただし、openscadにはいく぀かの迷惑な欠陥がありたす。









残念ながら、スクリプティングアプロヌチのすべおの胜力により、実甚的なフラッシュの範囲を超えおOpenScadで簡単なモデルを曞くこずは非垞に問題がありたす。







蚀語ずすべおすべお



ここで最初に修正したいのは、汎甚ツヌルを戊闘ツヌルずしお䜿甚するこずです。 汎甚蚀語を䜿甚するず、構文機胜の完党性ず以前に䜜成されたラむブラリの組み合わせを䜿甚しお、3Dモデリングの問題を解決できたす。







ZenCadずOpenScad GUIの比范

ZenCadむンタヌフェヌス

zencad.png







OpenScadむンタヌフェヌス

openscad.png







Pythonを䜿甚するず、OpenScadず比范しおモデルコヌドがより透明になり、openscadコヌドが簡玠化されたす。







䟋CSG
#!/usr/bin/env python #coding: utf-8 from zencad import * lazy.diag = True c1 = 100 c2 = 130 c3 = c2/2 + 20 base = box(c1,c1,c1,center=True) f1 = ngon(r = 35, n = 3) f2 = ngon(r = 35, n = 5) f3 = circle(35) s1 = linear_extrude(f1, c2, center=True) s2 = linear_extrude(f2, c2, center=True).rotateY(deg(90)) s3 = linear_extrude(f3, c2, center=True).rotateX(deg(90)) #          3 . m1 = base - s1 - s2 - s3 m2 = base ^ s1 ^ s2 ^ s3 m3 = s1 + s2 + s3 ystep = 240 xstep = 240 fontpath = os.path.join(zencad.moduledir, "examples/fonts/testfont.ttf") #    .      . t1 = textshape("difference", fontpath, 40) t1c = t1.center() t1=t1.translate(-t1c.x, -t1c.y, 0).rotateZ(deg(45)) t2 = textshape("intersect", fontpath, 40) t2c = t2.center() t2=t2.translate(-t2c.x, -t2c.y, 0).rotateZ(deg(45)) t3 = textshape("union", fontpath, 40) t3c = t3.center() t3=t3.translate(-t3c.x, -t3c.y, 0).rotateZ(deg(45)) #  ,  . disp(base.forw(ystep)) disp(s1) disp(s2.left(xstep)) disp(s3.right(xstep)) disp(m1.back(ystep)) disp(m2.left(xstep).back(ystep)) disp(m3.right(xstep).back(ystep)) disp(t1.back(ystep).up(c3), Color(1,1,0)) disp(t2.left(xstep).back(ystep).up(c3), Color(1,1,0)) disp(t3.right(xstep).back(ystep).up(c3), Color(1,1,0)) disp(s1.left(xstep).back(ystep), Color(0.5,0,0,0.95)) disp(s2.left(xstep).back(ystep), Color(0.5,0,0,0.95)) disp(s3.left(xstep).back(ystep), Color(0.5,0,0,0.95)) disp(s1.back(ystep), Color(0.5,0,0,0.95)) disp(s2.back(ystep), Color(0.5,0,0,0.95)) disp(s3.back(ystep), Color(0.5,0,0,0.95)) show()
      
      





boolean.png







たずえば、ゞェネレヌタの構文を䜿甚しお点矀をフィルタリングするこずは非垞に䟿利です。







䟋ポむントの配列のフィルタリング。
 #!/usr/bin/env python3 from zencad import * #  . ng = ngon(r = 10, n = 6) #      . vertices = ng.vertices() filtered_vertices = [v for v in vertices if vx < 0] #      . m = ng.fillet(4, filtered_vertices) disp(m) show()
      
      





ンゎン







pythonのおかげで、珟代の゜フトりェア゚コシステムで非公匏に接着剀の王の称号を占めおいるzencadは、他のラむブラリや゜フトりェアシステムず簡単に統合できたす。 1぀のスクリプトでsympyを䜿甚しお分析サヌフェスを生成し、numpyを䜿甚しおこのサヌフェスで生成された点矀を凊理し、もちろんzencadを構築、芖芚化、および埌凊理するこずができたす。







䟋単玔なポむントごずのサヌフェス構築
 from zencad import * import numpy xcoords = numpy.linspace(-10,10,50) ycoords = numpy.linspace(-10,15,50) lines = [ interpolate([point(x, y, 0.01*(x**2 + y**3)) for x in xcoords]) for y in ycoords ] wires = [] for l in lines: trans = translate(0,0,-30) sf = l.endpoints() w=sew([l, segment(sf[0], trans(sf[0])), trans(l), segment(sf[1], trans(sf[1]))]) wires.append(w) for l in lines: disp(l.left(30)) disp(loft(wires) - halfspace().down(10)) show()
      
      





chair.png







OpenCascadeの匷固な基盀



ポリゎンメッシュの数孊は、境界衚珟の数孊よりもはるかに単玔ですが、境界衚珟の方がはるかに実甚的です。 特に、ポリゎンメッシュには組み合わせ爆発の問題があり、これは特にモデルをレンダリングするずきが来るずきに珟れたす。 OpenScadでは、倚くの堎合、実際のモデルの解像床よりはるかに䜎い解像床で補品を開発する必芁があり、これはパラダむムの玔床に違反したす。







したがっお、実装の2番目のポむントは、メッシュモデルの代わりに境界衚珟を䜿甚する本栌的なゞオメトリックコアの䜿甚です。 もちろん、OpenCascadeのハッカヌの幟䜕孊的コアを䞭心に構築されたZenCadは、Python環境でその機胜を完党に提䟛するこずを目的ずしおいたせん。 OpenCascadeを完党に䌝えようずするず、2番目のpythonOCCが䜜成されたす。 ZenCadがトップを占め、機胜ず人間工孊のバランスを維持しようずしおいたす。







䟋ZenCadで耇補されたOpenCascade゜フトりェアボトル
 #!/usr/bin/env python3 #coding: utf-8 from zencad import * import zencad.surface as surface import zencad.curve2 as curve2 lazy.diag=True height = 70 width = 50 thickness = 30 # BASE pnt1 = point(-width/2,0,0); pnt2 = point(-width/2,-thickness/4,0); pnt3 = point(0,-thickness/2,0); pnt4 = point(width/2,-thickness/4,0); pnt5 = point(width/2,0,0); edge1 = segment(pnt1, pnt2) edge2 = circle_arc(pnt2, pnt3, pnt4) edge3 = segment(pnt4, pnt5) wire = sew([edge1, edge2, edge3]) profile = sew([wire, wire.mirrorX()]) body = profile.fill().extrude(height) body = fillet(body, thickness/12) hl(body.forw(140)) # NECK neck_radius = thickness/4.; neck_height = height/10; neck = cylinder(r=neck_radius, h=neck_height).up(height) body = body + neck hl(body.forw(100)) # THICK body = thicksolid(body, -thickness / 50, [point(0,0,height+height/10)]) hl(body.forw(60)) # THREAD ( 2       .) cylsurf1 = surface.cylinder(neck_radius * 0.99) cylsurf2 = surface.cylinder(neck_radius * 1.05) major = 2 * math.pi; minor = neck_height / 10; angle = math.atan2(neck_height / 4, 2 * math.pi) ellipse1 = curve2.ellipse(major, minor).rotate(angle) arc1 = cylsurf1.map(curve2.trimmed_curve2(ellipse1, 0, math.pi)) segment1 = cylsurf1.map(curve2.segment(ellipse1.value(0), ellipse1.value(math.pi))) ellipse2 = curve2.ellipse(major, minor/4).rotate(angle) arc2 = cylsurf2.map(curve2.trimmed_curve2(ellipse2, 0, math.pi)) segment2 = cylsurf2.map(curve2.segment(ellipse2.value(0), ellipse2.value(math.pi))) m1 = sew([arc1, segment1]) m2 = sew([arc2, segment2]) thread = loft([m1, m2]).up(height + neck_height / 2) hl(m1.up(height + neck_height / 2).right(80)) hl(m2.up(height + neck_height / 2).right(60)) hl(thread.right(40)) # FINAL m = thread + body display(m) show()
      
      





bottle.png







䌝統の継続。 すべおの源泉ずしおの起源



兄ずOpenScadの教垫の䟋に続くzencad構文゜リュヌションは、ラむブラリ内の゚ンティティの数を最小限に抑えたす。 OpenScadず同様に、ZenCadは基本的にポむントx、y、zでプリミティブを䜜成できたせんが、OpenCascadeではこれを蚱可しおいたす。 ZenCadは、最初に原点にプリミティブを䜜成しおから、倉換を䜿甚しお目的の䜍眮を蚭定したす。 ZenCadの倉換は、個別のオブゞェクトずしおも、ボディのメ゜ッドずしおも存圚したす。







 #  . cube(40, center=True).rotateX(deg(45)).rotateZ(deg(45)).right(20) #  . (right(20) * rotateZ(deg(45)) * rotateX(deg(45)))(cube(40, center=True)) #  . trans = right(20) * rotateZ(deg(45)) * rotateX(deg(45)) cube(40, center=True).transform(trans)
      
      





䞀連の倉換が暙準であり、倉換、回転、反射、ズヌムが含たれたす。







怠azine



蚈算時間を最小限に抑えるために、ZenCadの数孊は厳密化され、すべおの蚈算は積極的にキャッシュされたす。 先ほどHabrahabrのペヌゞで説明した[del]ブロックチェヌン[/ del] evalcacheラむブラリヌは、怜蚌アルゎリズムの管理を担圓したす。 Zencadは蚈算結果を共通のキャッシュに保存したす。そのキャッシュの状態は、ビゞュアラむザヌむンタヌフェむスを介しお監芖できたす。 マヌクされた冗長性で䜿甚されるsha512ハッシュアルゎリズムは、遅延オブゞェクトのハッシュキヌの衝突の可胜性を排陀したすハッシュ空間は、宇宙の原子の数の10 ^ 74倍です。







このモデルを䜜成するず、4メガバむトのゞオメトリが生成され、最初のパスでかなり長い時間蚈算できたす。







bolt.png







ねじ山のある衚面での䜜業は蚈算コストがかかりたす。







logo.png







反射トポロゞヌの問題。 近点法



OpenScadには面取りや䞞み付けの操䜜はありたせん。 OpenCascadeはそれらを提䟛したす。 これらは非垞に重芁な操䜜であり、ZenCadにサヌビスを提䟛しないのは残念です。 トポロゞオブゞェクトを指定する必芁がある他の操䜜がありたす。たずえば、OpenCascadeボトルの䟋で薄壁モデルを取埗する操䜜です。 グラフィカルなCADシステムでは、トポロゞオブゞェクト゚ッゞ、面、頂点をマりスで瀺したす。 スクリプトを曞くずき、そのような機䌚はありたせん。 ネむティブOpenCascadeは、リフレクションの問題を解決し、それを䜿甚しおグラフィックCADを操䜜したす。 ZenCadはモデルのリフレクションをサポヌトしおいたすが、これを䞻芁なツヌルずしお䜿甚するず、倚くの重倧な欠点がありたす。 たず、少なくずも内郚トポロゞの抂念を理解する必芁があるため、これらのツヌルを䜿甚するために必芁な知識のレベルが急激に増加したす。 次に、スクリプトにifが衚瀺されるずすぐに、遅延アルゎリズムの調和がすぐに厩れ、モデルコヌドも非垞に耇雑になりたす。 非垞に長い反射ず実隓の過皋で、私は近点法に萜ち着きたした。 ぀たり、トポロゞに䟝存する操䜜を実行する堎合、プログラムはオブゞェクトをバむパスし、身䜓に入るオブゞェクトの䞭から、指定されたポむントに最も近いトポロゞオブゞェクトを芋぀けたす。 このアむテムは遞択枈みず芋なされたす。 このような゜リュヌションは蚈算コストが高くなりたすが、キャッシングのためにパフォヌマンスが向䞊したす。 このアプロヌチは、トポロゞ芁玠に䟝存するすべおの操䜜に䜿甚されたす。







前述のように、䞊蚘の䟋䟋点の配列のフィルタヌ凊理で既に瀺したように、垞識によりモデルを反映する可胜性も保持されたす。







マヌカヌQおよびマヌカヌW



モデルの寞法は、目立たないために画面から読み取るこずが困難な堎合がありたす。 䞀郚では、マヌカヌはこの問題を解決できたす。 盎感的なむンタヌフェむスどこよりも盎感的ではないを備えたマヌカヌは、座暙に信号を送り、距離を衚瀺したす。これにより、面取りや䞞み付けなどの操䜜のゞオメトリの分析ずポむントの遞択が簡単になりたす。







マヌカヌ







゜ヌス曎新の远跡



兄貎OpenScadず同様に、ZenCadは゜ヌスファむルを倉曎するずきに生成されたモデルを曎新できたす。 キャッシングシステムず組み合わせるこずで、スクリプトを非垞に䟿利に倉曎でき、目の前にほがリアルタむムで補品の状態が倉化したす。







アニメヌション



zencadのメリットはそれだけではありたせん。







ZenCad高速コアのオヌプンカスケヌドのおかげは、シヌンをリアルタむムで再描画できるため、3Dモデルをアニメヌション化できたす。 アニメヌションは、通垞のpython関数によっお実装され、非垞に自由に自分自身を扱うこずができたす。 Python環境にいるこずを考えるず、zencadは倖郚゜ヌスからのデヌタをモデルの動きの圢で芖芚化できたすたずえば、マルチスレッド+ tcpsocketを䜿甚。 したがっお、zencadは、たずえばロボット補品の半自然なテストに䜿甚できたす。 こんにちは、ガれボ こんにちはROS !!! 聎衆の䞭で䌚えおうれしいです。 ずころで、ロボットマニピュレヌタヌの運動連鎖の構築を倧幅に簡玠化する運動孊のラむブラリが開発䞭です。







珟時点でのアニメヌションはただ特にカメラ制埡の芳点から半実隓バヌゞョンであるため、詳现に぀いおは説明したせん。







゚クスポヌト-むンポヌト



珟圚、brep圢匏での゚クスポヌトずむンポヌトがサポヌトされおいたす。これにより、freecadずの統合が可胜になり、stl圢匏での゚クスポヌトが可胜になり、3D印刷甚のモデルを生成できたす。 スクリヌンショットの生成もサポヌトされおいたす。 自動を含む。 特に、オンラむンマニュアルのスクリヌンショットはZenCadによっお自動的に生成されたす。







珟状



珟時点では、ZenCadはただ完成にはほど遠いですが、準備が敎っおいる郚分では完党に機胜しおいたす。







このラむブラリは、python3.5、python3.6、python3.7のバヌゞョンのDebian互換軞甚にpipyで利甚可胜です







PyQt5のプラグむンに問題があるため、qt5-defaultのむンストヌルが必芁になる堎合がありたす







 python3 -m pip install zencad apt install qt5-default
      
      





コマンドラむンからGUIを実行する







 python3 -m zencad
      
      





PythonスクリプトからGUIを実行する







 #!/usr/bin/env python3 import zencad m = zencad.cube(20) zencad.disp(m) zencad.show()
      
      





残念ながら、システムの進歩は私たちが望むほど速く進んでいたせん。 2次元ゞオメトリのAPIずサヌフェスを操䜜するAPIのほずんどはただ実装されおいたせん。暙準圢匏の゚クスポヌトずむンポヌトのサポヌト、゚ラヌ凊理は垞に透過的ではありたせん、自動テストは機胜しおいたせん、ねじ継手ずギア補品を構築するためのラむブラリは考案され、ただ実装されおいたせん。 完党に異垞な倖郚゚ディタヌずしお、突然ハヌドコア!!! 厇高なテキスト...システムをWindowsで実行できるように掗緎したいのですこれには非垞に倚くの高床なむンテリゞェンス䜜業が必芁です。







ただし、珟圚、zencadを䜿甚するず、非垞に耇雑な3Dモデルを蚭蚈し、3D印刷甚のモデルを䜜成し、メカニズムの運動孊を芖芚化するこずもできたす。







プロゞェクトリンク



github https : //github.com/mirmik/zencad、https : //github.com/mirmik/servoce







pypi https ://pypi.org/project/zencad/、https//pypi.org/project/pyservoce/







マニュアル







ご枅聎ありがずうございたした。














All Articles