From 7b54bfc8e3f6ca2333a2645cb141878b9f0de3b9 Mon Sep 17 00:00:00 2001 From: imsenthur Date: Fri, 28 Aug 2020 19:32:38 +0530 Subject: [PATCH] Added final structure. --- definer.py | 78 +- docs/_build/doctrees/anton.doctree | Bin 186571 -> 0 bytes docs/_build/doctrees/environment.pickle | Bin 34627 -> 20177 bytes docs/_build/doctrees/index.doctree | Bin 3752 -> 3755 bytes .../{interface.doctree => quickstart.doctree} | Bin 2254 -> 2259 bytes docs/_build/doctrees/scripts.doctree | Bin 0 -> 93990 bytes docs/_build/html/_sources/index.rst.txt | 4 +- docs/_build/html/_sources/interface.rst.txt | 2 - docs/_build/html/_sources/quickstart.rst.txt | 2 + .../html/_sources/scripts.rst.txt} | 33 +- docs/_build/html/anton.html | 771 ------------------ docs/_build/html/genindex.html | 303 +------ docs/_build/html/index.html | 4 +- docs/_build/html/installation.html | 8 +- docs/_build/html/introduction.html | 4 +- docs/_build/html/license.html | 4 +- docs/_build/html/objects.inv | Bin 1129 -> 548 bytes docs/_build/html/py-modindex.html | 24 +- .../html/{interface.html => quickstart.html} | 16 +- docs/_build/html/release.html | 8 +- docs/_build/html/scripts.html | 398 +++++++++ docs/_build/html/search.html | 4 +- docs/_build/html/searchindex.js | 2 +- docs/index.rst | 4 +- docs/interface.rst | 2 - docs/quickstart.rst | 2 + .../_sources/anton.rst.txt => scripts.rst} | 33 +- initializer.py | 30 +- processor.py | 16 +- properties.py | 83 +- 30 files changed, 662 insertions(+), 1173 deletions(-) delete mode 100644 docs/_build/doctrees/anton.doctree rename docs/_build/doctrees/{interface.doctree => quickstart.doctree} (86%) create mode 100644 docs/_build/doctrees/scripts.doctree delete mode 100644 docs/_build/html/_sources/interface.rst.txt create mode 100644 docs/_build/html/_sources/quickstart.rst.txt rename docs/{anton.rst => _build/html/_sources/scripts.rst.txt} (61%) delete mode 100644 docs/_build/html/anton.html rename docs/_build/html/{interface.html => quickstart.html} (85%) create mode 100644 docs/_build/html/scripts.html delete mode 100644 docs/interface.rst create mode 100644 docs/quickstart.rst rename docs/{_build/html/_sources/anton.rst.txt => scripts.rst} (61%) diff --git a/definer.py b/definer.py index 6d62869..056552b 100644 --- a/definer.py +++ b/definer.py @@ -76,6 +76,8 @@ def draw_arrow(gp_frame, p: tuple, norm: tuple, d: tuple, size: int, reverse: bo return gp_stroke class Anton_OT_DirectionUpdater(bpy.types.Operator): + """Visualizes direction vector of applied force with grease pencil + """ bl_idname = "anton.directionupdate" bl_label = "" @@ -83,6 +85,11 @@ class Anton_OT_DirectionUpdater(bpy.types.Operator): direction_reverse = OrderedDict() def execute(self, context): + """Instantiates an arrow at the centroid of a face on which force is applied. The instantiated arrow is + a grease pencil object whose color corresponds to the applied force. + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ scene = context.scene active_object = bpy.data.objects[scene.anton.filename] direction = np.array([0.0, 0.0, 0.0]) @@ -170,11 +177,33 @@ def execute(self, context): return{'CANCELLED'} class Anton_OT_Definer(bpy.types.Operator): + """An operator class that creates a tetrahedral finite element mesh of the model with **gmsh_api**, + interprets the forces acting on the model and stores the required variables as a numpy binary file (.npy). + """ bl_idname = 'anton.define' bl_label = 'Anton_Definer' bl_description = 'Defines the problem.' def execute(self, context): + """Iterates through all the faces of the model and creates sets of face indices. + + :ivar nodes: + :vartype nodes: numpy.array + :ivar elements: + :vartype elements: numpy.array + :ivar fixed_nodes: + :vartype fixed_nodes: numpy.array + :ivar no_design_nodes: + :vartype no_design_nodes: numpy.array + :ivar forced_nodes: + :vartype forced_nodes: numpy.array + :ivar directions: + :vartype directions: OrderedDict + :ivar distributed_force: + :vartype distributed_force: OrderedDict + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ scene = context.scene active_object = bpy.data.objects[scene.anton.filename] @@ -187,7 +216,7 @@ def execute(self, context): bpy.ops.object.mode_set(mode='OBJECT') for face in active_object.data.polygons: if 'FIXED' in active_object.data.materials[face.material_index].name_full: - # ADDING 1 COZ OF GMSH INDEX + # Adding 1 because of gmsh_api convention fixed_faces.add(face.index + 1) elif 'NODESIGNSPACE' in active_object.data.materials[face.material_index].name_full: @@ -235,7 +264,6 @@ def execute(self, context): geo_points = OrderedDict() geo_edges = OrderedDict() - # GET POINTS FROM DATA i = 1 for _surface in data: for _vertex in _surface: @@ -244,11 +272,9 @@ def execute(self, context): geo_points[i] = _vertex i += 1 - # GET TRIANGLES FROM DATA for i, _data in enumerate(data): triangles[i+1] = [points[_data[0]], points[_data[1]], points[_data[2]]] - # GET EDGES FROM TRIANGLES i = 1 for _triangle in triangles.values(): for _edge in self.get_edge_indices(_triangle): @@ -257,7 +283,6 @@ def execute(self, context): geo_edges[i] = _edge i += 1 - # GET CURVE_LOOP FROM TRIANGLES for _triangle_id in triangles.keys(): curve_loop[_triangle_id] = [] for connection in self.get_curve_loop(triangles[_triangle_id]): @@ -349,6 +374,45 @@ def create_geo(self, curve_loop, clmax): + """Creates a tetrahedral finite element mesh of the model + + :param path: + :type path: str + :param filename: + :type filename: str + + :param fixed_faces: + :type fixed_faces: set + :param no_design_faces: + :type no_design_faces: set + :param forced_faces: + :type forced_faces: OrderedDict + :param forced_magnitudes: + :type forced_magnitudes: OrderedDict + + :param forced_directions: + :type forced_directions: OrderedDict + :param forced_direction_signs: + :type forced_direction_signs: OrderedDict + + :param points: + :type points: OrderedDict + :param edges: + :type edges: OrderedDict + :param curve_loop: + :type curve_loop: OrderedDict + + :param geo_points: + :type geo_points: OrderedDict + :param geo_edges: + :type geo_edges: OrderedDict + + :param clmax: + :type clmax: float + + :return: nodes, elements, fixed_nodes, no_design_nodes, forced_nodes, directions, distributed_force + """ + geo = gmsh.model.geo lc = clmax @@ -466,7 +530,7 @@ def get_raw_data(path): data.append([]) else: if 'vertex' in line: - # IGNORING NORMALS FOR NOW + # Ignoring normals data[-1].append(tuple(map(float, line[:-1].split(' ')[1:]))) line = f.readline() @@ -480,7 +544,7 @@ def compute_direction(points): return vec/vec_mag @staticmethod - def compute_area(points): + def compute_area(points): v1 = points[1] - points[0] v2 = points[2] - points[0] v3 = np.cross(v1, v2) diff --git a/docs/_build/doctrees/anton.doctree b/docs/_build/doctrees/anton.doctree deleted file mode 100644 index 2393605b6b07eb7af4882af766dcd80b228853f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186571 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 JbNxYb=Rb_|{Nw-t diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index 007101e77309174dc2d11185b6644715a782c114..6fe7093f772a81ad4b4b4ccc4922ec80641c2b6e 100644 GIT binary patch literal 20177 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 literal 34627 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 delta 40 wcmZ22yF!+wfpzNKjVzpOqMVs|C8 diff --git a/docs/_build/doctrees/interface.doctree b/docs/_build/doctrees/quickstart.doctree similarity index 86% rename from docs/_build/doctrees/interface.doctree rename to docs/_build/doctrees/quickstart.doctree index 0aed764e25ced9fb196ecca15e188b5cbf35537f..e9fbf9dd3582b4f54b9975518b232e49900c3981 100644 GIT binary patch delta 152 zcmX>ncv+C8fpzMMi7XxJT!E#T$=SsviA5z-GT39MWN`MdgrruKOqo2T2T5+?#tG5t z`WgATsX!v9GC99oKQXT)KTkg;Ke<@H5N?KEQ8CaQS#PG&q{Ixl+9?_t3b8QeuW&?G%j+g;=05aQP{T R8A?DaR8Ryr&to)Y2LLvlH^l$| diff --git a/docs/_build/doctrees/scripts.doctree b/docs/_build/doctrees/scripts.doctree new file mode 100644 index 0000000000000000000000000000000000000000..009aead946070a956e53b3ace8f0f1a6e40679e3 GIT binary patch literal 93990 zcmeHw37A|*b*{C{jApdUmSlS*=X!6+qY=jPCNChg*s^6w$hI)@($mv@N8Q&w-R)i^ zjbr=a7YtsmG2mtiAuj}C2w}Gg=8=Vb`CjruAmovRmj{?7W(SAud)XJ>IknfV>RWYt zX2eTA{Cytvt@WH!f1TP+oqE;4n--k1;1v8XUfF7tE435jg;J?jFNLjcyrfhwcBaEx zyZdB!(}UgnySaF{SvcORcbdhp8=nFxiseeR)C_CgJG=1;Ox~_kTjMPMP%A99EA^Vl zULGh9mWS@_=E}qIK)ceehDuaCbaSy;X|!8iOadtu-x8j{s%6AOT|xyEb80-;C_ugK zZh3WiL3vR;$f(*MFRoTZ^P>Ns`4~Rz&HtUVB*{%Q`g!gq?kmUMesC+A}e1CZ( zvRFO~_$mh=uXEu4^Wgsr;Qt)ZT;5D*9iz$17XcXqK*lNYK&4g+Pbh+?ZPK%(cnHMY zMB1R?;>C?ZrP+%1`2oqaCR-1XC{6ITTln!FwU7J2RVY1pi)yP*wl?T zDx{jZx>lZPdx7{DL)R)A($7K63XI9ODuA?hr>S*~)68men+R4g<4TgTP^;D3g+zag z2Pq32SNv0AY7pAxZa+-L!zZSz+gptS_WmV}X4ndw$3g14ew z8(FbIRwz609fhPehzDuc?8YNfTA=#~H~_HmlBrI$N;TZ;k?mr61G0PL0;p#KNmJUO zSg*C!K|!jt;dmIda^YyR&?u`-bm7Yipl!DY+ev-fCng&+rxso{0IHTp? zPpV^3mV};oVPgjS%gh!k?l7sRe;0CpJegZf6b}Mlpb=r@Vk1izMq&(_E>vpW@~7e< z_(F+_HjS4;NO+=AtrRQm?jt0@@j|l(KZilRGB}jqg>=zo>6Twl3T+pfN5ghE?#VXd z<6|)V&2>K~VEaI4QbDq1PL1_jMT`3l-)tR6a zPQkRG6tu#2OCM5#cDc|FU@{SaUV~XdX=JKdpAI%}CfzxI@Rt0+LM^Or-W(KarJw@| zg2|Zx3WbbefCG1-4V95<0nq}(d*_T43AA_)3kA@9OY29&Fo|k6>$RgwCy3XWa^OmB zg)SgTCFu@7P6IST=!ZxEsFii`1)h?X%D^{Al1C@B<_FXqr^E5cR3)sI^3@7V4CNTc zW-Kr%CecO=&X-xvVfYB!cD|7MVdOXuI(FL3E_?5~O0Cka6snbbp_An%>-FlUV9S<(b*X20 zFK6O{857gmc@wuwm7+LcwJ=>a*LcY0Dk_^R97$EpOjW-{6;oZks6H7{P0o~V^b#nX zsP0xHELNr}#qPsY-Ht}vNWIWq76v)Jukk2TK&!Zb!s$l2(5kc)>Boyvz+5);Ll;WH z!6{G{EjKn^ZKH!wd&%1>vU0rMG0Qh&x1!2CEA z+=FWam_i;_VA5DOFduiYk`b622*mQGN|Wx=WX32(wpsv(t0hK9?h78QFywyMk<`Bd zP2~Q-Xv1%k+N{WBQL{tt(uM9Zm?3wGBdI^*3FIz^f_3Byt_|dh7%OsVtQ)z{JK8WK za@X+5ylaY}>(n8ZjiXe2>)71kkUJ8~uz9T`secoh*xYHf(sojt6`L$-cG#S7aD$99 zY~JZe>d$xro0Gk{Hn1t=VZ|nmbz}2#2P;{zIaR5KI7tt3Fey!$zUtUq!n1L3$^adm zZ}uRUq4P;cQvXIW(fL-Rot_}IS<%U&Qqj2xq{VqBzjd~M+rf*1&8Hnn{n<`n^V!}! z8`u=muws+Oy0IBMSjmXZ(~sAica!bge524VXG7=;Ju`2sWU$_B-}hjEq4hhCr2frj zqV;c$miq>&&5BkQH5;^!Eb<=Zha5@$*-oH!85FFK@`7grts=&XRvPO@>)$w9Fe6%5 z!X71P(XiH;_Ew{dF%O3({m=pVQir&aMh3`h97+9K#suWcjK;Z=)Mf=Fi%JFLVic2L zoP6kv=N;TA3iJ*~Qh&x1kSz4(+JK~xhZT}E)(y$a9IRx7(+mY12(M+tqV6@xUNo`iFvZz$7I(JKl7kdx-gN~&Bj3>~#6bjY{eZjSX zRuN-GD~)xd^=pnc%!t-A1mODFHC>_S=6Fp8>wtZUqcM;J2H2||N&VZ+1ndr@>8>EP zSpmzUW(U~29NZ}C^>#;6f5sDlo#@TA0azgqD`07?8?cu;Sjh_5QdnzM+B2YDt6)Lk zJhjr7{b2H=<`#fW1nYq9dT_u1`vyl+|8_G0`(~r*9w)U~0n4Ih2iRvE+$ezkup_BI z;|ak2c5ki?zzTU-0ZU`ufPK`#N=CqLY!S#+j`a=NHD(DMxV9)Ayx;ZUhJp86j->u= zXoC0qMl(K7YO{iuMa>SpO9s5B2Lq0z{){KUI|2pk(*wb^0bUVf1uuenJh|N{aX)qMdh|I;9 ziMI{?(3|E-4VU++lj-!vvF-(<8-Olq^Dl10rHl}|hPQBe6IM^b;*6R7-XZ@vvw z3W-=zNn_ope8j;@MpT~3r;^2Tp>`DZQ?qGKF+ru-IZ~6sI%dD)!2-kVHyug+8_vY+ z_l&mt8&aDUvn*=1m>nAQ9_1H1lKQir!0a#-tdH`7Zv(R;#)?@Q>&EO?9IcoUv#Y{> zG%04{_*_grbW~pBkT(*^P`TZa)W2y=RKCP$oy$mVR#dX6*`o3e2S17?eWfF*KkErp z-qo9L1C>G|R#ehhH!3f2u#yp#>!-tZVG``Vn*}gV&89||DtS3ZwJ;s3Z}gy?LG=ko zQvdccq1rW?>@iZC6{;+1wov_ugC7N|A9N)3XFUPcXL|E(KvhV@3RN2GhU&u(Rx(2M zbPhLMsb|INGBq;?s~)JM_1hlAGqirgk<`D*OtgO2Xtl4A+N@}0QL{zs;E?xlzsQl) zpY;SxHl^{jYZp=alaO$O_j zz1qG%c5qB+1nlbC>r)QM^b;*6PUfTH{S+kg+#2F zrLk_zzSzM^M$B%28;6A|Z2Q9%yLt_7LuN(os$>Biw`PQn+&6eI!jStqM^gXhGm-nG z(SnbX+N{WBQL{zvhaLPV$o+sLsXyxptH1#a?g@RDCEj3 zUKr14$8wsj2##NSq>kZld9cJV{B=iC|AsU%{2ik$ze;MeVwgpxV%TBNGO)yZwy@BV z)SvAHeuto7eYPNYHt;KAtoWs|Zu~yyXu*v5U4N`{FJ2@ha|PIM&0>JHT+7Q5n+VmR zdX=Lgka`ByD;!Dv+suUOHAb^-Behwf%A#fi)gumG6jl2QM^b;b6HvXQH_rxCg*2>C zrLk_PUhH5cBUDelJDiznqI;QaFdY{8I7F2Y9iFfEpqRn)aYs`Bb~54lMx&`7A+=fI z$)aWh&ks3xQQ-N0M^b;b6Y%^*KrN*+8X; zv7(a3x>5NhM+;^|r7}OQg_Wb_N$@t7QGY5^P+0^=tUXf4?{-J)AWICtmphXBH>8Q* ztBtn2gw$rmFN>NDeqZU}MbWB<9ZCJ!PT=?U-aH%l71FTcm&UsB`yvM`8S#7SbO9!( z;KU;1)s-bY9|x)o(82kH2fYlOu_LK}E1BSYgV9hAliIA{WKpT$T?#d;F(%vv>C2qgXfA1J#J*5Pm`iA7>84)XcbMm z+@sW`Bx#wr#3^r}Zt+q{F25VR_z)jt)FTbJgVWO!eMO}>yftwZGIo1+% z;6{R?Q%1m@#ZawIy&^sW;w;}q+#;d7LPlSIz6Hxi;@loIW7nLV`8X9cbEP^J%yZ8f z)G4NV4Pf~<05?xXmqSuSKe+y5%%MZJXf-1Xg#8}QD94%fax=#s z{-T=_!YGTOBlh&^_j{b!=r$~iwn9&zc6w7BK~W@}tLDmo;^W9KI&8_S>n7&Qul#v! z6e>Z!EN=YDUyAl3W6zO>D}Q-j{q@;!O`JoLhDs`Am0d&>xa^CLA+0pa4fvC~l#~Fv zgnP>)-uS?!ZmAVagVWtg8}6>5!@jUkEC+=KI5dP?Y*VOKsjEHcTYcpfEgtp7MDPryjYe+-hLb2y zG#&Q`_XNsDs0GLsU7%D-X)DXdTq|2HqoK^O$jPU{N{CMWZ+Vc<=E3iABvm_Ny300m z9{heNTVHU$i_~VF2eT-l%vh^x-mg6Dwg1$?4*-;VYWbgzq$=ytCn2$~W46yg+8%rx zGhrbS>r9x&%0VmXyq0#i(dZoxR*-8pXGOd^v=X1Q#vY~8IcvnbCf5+@B*U~-44$Iz zn3GqOxi)!?{vFpC7##f+esL$g(Ee zxi%N>!c)AKFWoDgH44uyTA1jr(FULzq;V$xLtLl3=3Ln1;AuTtFLDrymct~ZFE`)i z8{$)`%iF8Kn>Y6{DgBslQ3Eyq-3kfu%WZDUm7Ip(ay5=ROFeK)o{XipHcGfnFe~5X zu)Y|xmZ~f<6bis``Ps@R^`xFR2vQxkE6g+hjQ$*WG`gyZnUV&kolFXLk4e&p%72wMsk z8*40VVFRLH@Oe^`fH-U($FNQo8^47_(#6ID_%pfKxP3>7EHCIrZHu^{J_ZkPgeQWd z_@qQDDAt?syaAYYpr&&*a~r$z`)d zU&jy}x|JdFGZ5x6L{g>uRJ<`2dE^}y96)JJWB~mvR!X&B%I4jJL>*2{?B8+A-ov{m zCdPt^i9LI7+r5ka+<#!#?wj{sxBupYJ9a`W(Uy?lz@eSH^S^jM1n`q9qDV({MLIFD zYww}mJ8#*0U_VXFbSbLNW3aI^8G-j9&~U<*a2(0fNK3skD@_|y zVJJ(F9SPHUSe3*x=VO@)b6FeVrJ9wOb$rH==p{nc#l2EksF(VNZvm)_e%PCx-w}i8 zp|uEDqKEq0)Eqh#!i!in@j9CL76Ku1j@@$R8=8+GK|)o6PDtO-ylBtf{d;e|e)q1R zG8MEsMSLg*UQ8MbcJA1}bN9Y|5K)KMV4BA(E$V(UCszY8;+|!npeqqjEK7J$0xQ4H zB*nE{`a}+O)vqRUK;f&BWXeh`akes~PFX%NA()ip4~sBaG--p6CaCF){t-o*qKRWQ z)Izfh=cCcvfHsHr=NpKK4|S-vbRE8d_!^H=*#;u-2E1|8NyZICK7b3XY7+>gitJZw zvm3gB_#GgNZXgcQ`Ei%-AijX%$sI&G0rowOkNCP=tk%7$`g=hYdwYx$_0LwK$nM{4 zkKiv7lcv3LA<=V(Ox+!ns|_V*V&Nb+DBT-m>ui+tyFa#Sxjq}}-OupNj=KSU1{otx;6Ul7z~*&dTTMQ33FiS04^bRzC^YP8Zdm_1UbYD;FS za6x9HN_O{X2nzL>`GZ)Vinc;pzBxuYBxC9@qwAz?j_pneqR-8-gIJ93=GY z%%FcQQ={Pw`d1P;`k6r+W%NCRemX%-I_P@Pug;YPtdle7B+V}6F&e!UXmjC%9l;|$ zJZI3a_9&Ijpm{goJ+jZ^;3M%Rt{rA&wjei{?VHg`Qn^*Coue9Lr|d7EZ<{9aa%a80 z{1b0<@p&W8W_}=Y#kbA%ypgj;cbB7Y!j>gBdXk&GIAMss-#hBZJ)@vA_t+{PUSWbc z`Zp*@TTP+LV|&E|mJF(POzage@J!D3ilvOBQy^z@ulT#r1RgU+ItO_w-jIeOu~kef zBJ+puvnEcRPTn>IW?whqITwtag<3EPn;Bg-;8Eavo%Hj zUk-k7JYkPU{+T1G%6jxikl5E0`7a=C555gkWFZl&DKd?9b=1-5-40feYxYL;yGYV> zsIK8Nk{p^+c)urw_uAm}Tpo+@ZylY3E6sVXI&DQ_89Em^lKMB1X(+!0%GO)yr$jVX zbh4;abS@@#Cu}Q`e&~#!@8Cwk<~fd}{){Isj9%EAYXh4?9#(A9ST{ERb#AeFdIPRT z!ggQ|tlt_lv-0R>?LF;ixQhzZd(0X5Q85n34(y^kI#=6n^atABObp}nkj;z`G!s=qo z%G-&4=neE?4^sIk??~$3KqgL~HrnXDq&6!~S=3zO^v@lb>xD);<> z&E%IuQrApgxhHt?%xca@!j!EP_on*Ui5$?qGMm*HW%PY0a7BWezUcQl6iCvXia0p) z8ja2Z+B^>h5Feh00u;olwMXnwfUj!#K3QrebSDw<%}#+;!+?b>K(viuYF2~m5}R2~ z9XK=1YRJC7w^>)zaT0iAk%aPw%J&b#~h`C{_zCv|j?d zq#_&;w()c?Xv48$p&XW)g=zpD7(56EVKtma*X_j0363O*#SvI8;1V0IR4;a@L3hk==n{65c&% z&HzPVER`FtHD)%+gT zJx4`9YLp+c`ap%Oi>oKKm4tph$@N+!ELCz3tG_uL3yI!VdSHL^t0VC^?U;Eu@5eiy zd`wM_ZqoAR++InPk`lJroJ_tfNW0Ye*<{U1vAIT}T^=J{6fY&>uM=S@kJgT@v7lDZ zQ~LlOKs1AhW?#as4dh@!B~S`*2@bsPn?ZRrcz|#aPo8d}(%)g}DAvh?*k`fRJQn7w z^?G9rbRRr)YF<7ak@DuzVZV|cS19LG2R$9Pj8uXF>aIHcF zpVO_F79$rVBGOElWH{(G`k}W`-J%>*jhF7WWKgwf!g%Q@Nv;#S1V<@yFBfM&I>CAz z5G@0A!e48lBbD%9vSi3e_)?|ET7+#x1NmB*&cUx)2ukJPS1cJaa}1 zxX#V97UEL5dB&0W>w>}>GZzGQhh4D@3LfY z(%XCa$R~x&L|sntqbX3#NfY%05a!qpq#I06#iJ?fEn%Hb>mW?Nf{rxSnNtll3t89689H z{0J*EHArwy){TGT03V)_vxDNVAYB_6issDZa|N!Zf?TWJR4kODs};*pww7YMx3-1V zzdD!@CT!eh?jK18fRAZo$)ZxNFBSo{9DwAvF4NVgn$rojL!(TYedP*AQq|fb-Ly1e zZE-3TEZ7DYZ=;dm*|4?{F;;5}8rxgn(C#oA{hgx`kZWcY^b?ZQVPDA?uIbp2OIC&t z8K5`HZil3WusB9`kPKFgu&CK!y!FZE){^w1RDd5y7*85fNj> z2#s}P3ArB4}z06A{XAQ`NPXr*j<6WQ0}Dz6I}xtzO&iOmFpy)=~C%4u*tyIm&)a zGFVZ@qUI81BWu%#Yz1XQj--8~Y#9_R#6VCcWMH67#8^>AW8EnGfum6}qDzsJTSVAqRO1Y7RJ(_KlibpkN^ef*K(M12rPX ziW(a0M$KgoRx+YyJvj~WQ$-#JBo8^L6SCrvd5~nVLWV`nC1l>_AWwnJTO3LIhRoZc zU?Bzq86g7$G9tzb85-+`%mWTqGD2p9JYVv|jd~!(6pk9CE1f@c5GzE-5%ejN!HOUj zHJ1o_-a(#%pszZT_Kl!#K*2%`1VKUu27*M46+txCji5hvu#y!)^1$8`K{5lMS@%A} zU%M`SHX%gE5wx0Qup)>>%_V|1JIGTIbfF_@-v}Cmf`u3ef`kkV1c?|cf@rK8K`R`r zWJJ)Yu$k}!kYY5!G>{UaE1)|alnS|V_`H&2u)>E$%_V%A4)PTE)E!CthEE#`7Gfaq z5i&5~BVw%Zp|NiG9Comh5k9MlwSnmtM?dNCuuyo)L6?vc2g|RM3|6qPs8q0cypH(^ z2T2M*o^>Sc8z8?61q;>*Km^|gKtzlcAT-tukpJdj#Q;cZk^F-C4?PZI*#&hx(sx|t z;V$#PM9*xUkJ*X~=}cvbZ(U*iiwEn>?%*FGsmty_xuAZe2G@bW;GW$SLQ8#O`_F>q zDG&=_`yA{`?s<&`C2;K1tW3h2R&X@{UoYmv_WQ+g?{^JzNvUH(TvCEK-n18PZ<3p!?J~UZ zcoe+agKt;7@JX(5Vf)J4pXjunUmOJk3h)vOFFq3A_SA>HxcWWEr3!RMk0Vo~(PNA^ zuA|&`g!|^?<`wU5?8fcGLd5+U5h^dx^R>reeit@jo$?N-$~7#oq5M~ostpWlb7n%g zo{Zi7c{>{*dHKN3zC@!EmG%1`{4pO=zvD=%&P~(J`Ai>De*k6c)6-{3ZPsZyi%OlA zYktjGBWq#07{21*O_`#9$&pkQL-d!B*wBdNa_65xHbw+syM3h7wEOJm*O z%{y4h2;Q?3>;3)!tXO?&AU48vApgDxFMQ_UNb28$CXoNYXvAkpZB`(&sJR64mmRz* zK>ng5slON!K>liP85lqo(y;=W#=3$0Q3op-fy}K?XEE312B;c@^*|lJr=HfdlCe%C_T`Yd7@sm+RC7B!dneX)Z#1;1MzN&Ur;!0)!+GBEHfq+`V|jdkO9*uhFh z{BDpttG!OYq-!r&ccHfm?H1UGEP&5`)gT?YWe?(+<_#T5{hQ20Ze+Atfz)P2E{jS> zu3{&}rI2E`{aOca3UXiVNa`3vgm0sJAaiv}xbaN)1cYrZ zo(V}^TZ_sm;mLDj{bD4{`(io14LP330o^OJ8*8JCzTH^wPEeD+q1}UiFE`dnnp1I1 z+*n@(w7IsP8Hf=dnLwOcJ9lHvx7qn_e`+RjBFWD_1Xi^p7wlSON7Qm6i5sQ16UqC4 zv-A^5H&xuND^Mj|*y_1@xv_o?)^577e$+}7ak)I(W708s)WqHK-P$O@K~dA{F!^kL zIM_2=!Uv)B3+?uttoX!8(9*99<#&MK{L}?MAVn9-Zx^}Zn`U>MlwgCp@$1Kz@`nUT zS$ru=Mxqa50SRBqXQVVD_3oRJA~C1ROdonzw$Ud$O7s>e)Nx`8Yn!K{PeM8vw~2RU z$|pG({bfeeN%OA!`GgSU5-c9wPJHripO}OvgxWKWur+>wdF!2^6IU^$L|?;Ve7!3_ zkG%KkUHL1Pyy|gyFYn4PK)#Ic!+#EWdXBV|!@KgF_c($DY#PUaMcgd^JJLxXhyM%w zNzc{aFZ}nuf^TE7gbt2@A5(ZC6i&$tjYhQsu8xU?6ZN8e6rX4fg9f}- zS`p9d%(@)W{i2~!pmQ`Dz<<1FM(A>9ek84ktzX}`+qiv<)iG{Dr%D^1P0q1NzO<|v z^Kg>+yd%v|?&h94lNUbg7pgaTwcjK>7d2=viYDD4@;9Bra69|`lY~8 zQnjU;_grnspz5=PdCwJ|$(ebN6mWDo$~s}*6F`__u%hbksaP=xOMqF(nh$5RCZfX5 z!AhNWKJVRIg9n{!?F#k!UJKy8y87_|Ji()RPZ7MmH|v!WQB~BWhdd))DVCYaf@i0h z4jT_{fgBZCT#1!cX~8?unpT5Xr12d_c#pacnyy%{f-)@Do8SPxQLmN23w)i_t|>=h zL-ZerVySeGVq=U(A!`$^IntMNsC4J8ZxW153XE6`mFDa{tb3uBWXDwd8SbI5jfCS! z&<56Fde|uaOg0jp$kcMU5PvL@qo0igqYN?YiCb3$dPtB-H6&C5hS<7q4zBj%h3MZL3p9_vE0NM*lA)C^B#Z4e*QHeMm42e0nU zp3_VU`rYNZV1q9v_=FjEdCn2J=D1;C4^r9U8IkhiCsb;X064LZy;RVYWt&HG5^ci* z65BlTK{BP?*#3gq2#IlKXJ(3UF=C@gDwJp=6l$9*4+~lGhqHD=NJ+Wl)=m@hW!&0%1@iP$p2SCGi zam*jczRs(WI=ZiO8~#l0>)dy9y?TtjS5XMZAl?IW@Xkj#if7N=Uk#3^#vO#WGR+IqB;CK-S?M=~d5kOoM`h-|(# ztNNpNLw1G}t^TDG6QcKU0)|*ff`Xr9rC`ChEFp#u3r^)oW?unqnBxfr8SfJ@_Z6FK@>+8bp^ zMUru8zdb>XTg@7E!xIoe9X9-$$1AN+!Lu4_;oAjlc-jzXOU_A>_+U$W#D`;O=1co! z9;LFSJ?{o$?CNhVcO>4b95RS$r)7yF&lk>1OD1-1_0^w2Zk`_{(GHR;mw15kWbr}1 z%;Tlb`b^DffiCpoaxm&w(rcU~S!W%3wOFd9{+>${>d*VRh5zpl8KtW13 zdKd+rI8e9;!kmjFI_-WcKGR&t2{H5a6Rm^{CM~Sbd6sb6?h|1V95#^6d;YjAA8+lE zVmTXq9IF_OKE`U|{WV>g;STxyAdRs7j9}X`hR*e4AfJZHT&j}olK%v4d=b`_xiJ>lo5`&@uXOOCs7};IbF4ari!Qd$E53D= z`DqU#`Ro9a`m4;_j>9S(EH66McCa}(bnE{8d-q?Lzv;lP9s7bqomvf@`P@`56{=&w zjbYf(=5|4oB{*JzXT)INvj(qoj6*Tv6gt>hs1?I%H7t!0^AJ8O48ju?@a#n_-s+up zP^x1+h1yKJ3_r$#Rvq364?49{JwOwbnV?m!cdD?R3Wjl=RyizTEqnIv-+S}*yLSb9 zDzyp*+UqDxp>=YxKHaE>ZLFpO9%>5YC2=g};EtPb&fjwVp#!&GcYSaWjy!=-;_+rI z*o9OOih#6I(7;GEiwTbbQ9-?i+4t_hW%r>yJ9h34_QKSviEeMkg6knU@Em~qGAseO zB@^RPkZaT%od&ECYn|36ZqoAeCiodPf#_yGZ-t*>E5OR{IaFKT+i>rL9AEIziG0pW zlBSLYd~=D;dDD}!%_Y7*)^$Q z!(tB1e=D_s+E?H~9JLYwn}l=4$9T`&iF+v048v`ja9PhnbG2z04el8Og+CS?t5-YI z=p3_JfPfD7;&;E;&{NO(*=#@!5}Jz4G`E0={kjX^p}P;d%qEd5etEw;bUnFc*Hs=D z44sjZl%8s*q|n*DS`hAQ>3|!OlHKSkEC9F6bcchZDJ?`-hmmHcya>{h@aV@&PdPCzLq-}G zT7}6&flBeYZ0gx1q6$4o$9w)h)AXS&6W%qsa{wuSP15! zC|pROllioz)>JY-XvvV3%;}DeOcqKo&`FT_rrHs))^6dH4I@f(`r}Ru$ey= z?AvkOjEmsWkMeZ0_w)mfogZYcM>?<6F zj1YipG&mZ-5djxZH-(T7O#NZNzGN4@Isk(--U=9*F2MR9{>SyxOt5+Lp7CI32dJ-v z&CQ#~AYkWsa6_R{4%?eIlXcnV&DV_wHy5G$YPGO=v$T)-%m0M(kX<4EPstvP+CN}; z=hN!)kHk2;G64soIY37&RX`#oL?%lAfSoE~7N>S*>~KG1wSv`158I;@nwD#bLh9$S}0o8P%Rs{tE8$3mrl7qG(wtKk8v#Wl*R;?FcXDSSu;S_8f!DXa!yWQBn zb?fot$H%7&?ecgBbmx`^YR!u;8J}uyeW1wn6A^L_F!bW=mB_~ED>sP#GH5?_Nl+dp zM-lK~E@n^Hf3W7_{oq%pHb{^V2T))cAAxLv=dXpDb-7m3(AaRtCd)4UW&;# z-Z%hRtj&GtPT2T^aSR44=D<2+Lr@6o$9AO{z@Mq98r&!d0%+Z41(uC`XD;qDw~#?} z8|CIO{*z&IV?)IF8q)YW3CGY8Q0h>Z{Ib?jWNHIjS@k%EjxI8cymIMYde4Uy7B1xJ z1JAY2^dxjbxGD`x=dyfPg7!4sNtt62_K<@!apJ(wtREy9a6~Z9tXWjz&@Gx!n2pIX z23yCI-vSjx+rG^~4)z6hPW=`~QuV|!(>e9qp z2K}ak3Y-|BwWFwffokguA2Mz@UJ_0>%7s>?rH(U0n~4B7^SQ?W`Am@U&u%iJe}pu$ zHuT7pXcJkcB~Hz0z*=x;g|&!Xk!WxU=41@3EgOVC;~|6$5Z;a|G`DRGRH*@C(5&H6 zSouj9gLzO57G9NOuo$#LIdwy3%h~C@&j9l#lEDgQ7A3(9mfMUCiRK{|BHNtkrPddxuelvK?;CAwE(Q$B6(!1f39xr5lZeaHxyQZBVC?eL(#;-L-S5 z3j#7LY?0G|xrnjCT*RL3hJk3>*dsA?0xUaQC%E53R2e$K=4wHGfe=j*f;*~(>B&+d z*jE6Z4{K8R2h0%cYMgBdBN~mZ-!C~xHIV(+B!d;%EGl(&?C~z)j~pZ^GvvQ@Bvog~ z(T700d)nkhKY@Y;>tu#3_%@I!VywuNv83H(myQQ$03Zz0s0f1<{9@d3P$yL@w`0im z3D)q!^}`SgkOdQ6vHl#r$W(*sXf39;(1BB~B*J9(G2<*{xaaYI`HSY2Q8N7ARP-PI`*q z+vq7G#@bV4Z10|eY1Ez)t%CqDWn0So$aF{ak41MtqYBKDzHvNJh*#f8)(q{M#J_qa z(2Rq=ku1aAH!cHG(?DnRjnpE!AL0`p%MNBigPT2${WxwxQzA*-R^!6dkvGs9y()JyNV^! zBH~nF6MsVg9f)=H6^3dAOeR#P*3KOh^NnbJfR&nw*oE;UUIAXyE(~Wa7P~MErWROB z_}MS>*|XwYh%p=qsYY0mu3WSNEz+k>8RQvCLe2v?ZGagQ1#G;_28 z=!SMb6aVqvGDpun>qQRYx#xVKr@z~tH^ghW=bmHSe`mAH-T7=$!t~plk^sB2OqtPe z-lIf`t9gfI-LrJxv&mAX;=e~$4#sk4$uD`mRV77p;Uigg+sUo9P|>dspM9dOeeJ=} zhtKsQ*W5Rd?#5@SB1OLasf7u=lbOivf-qlp(3(%O6CJ?<5{`UMwaA;(VvW;js$`}K zP3~+oNj($oghFk`Fe6f4+?UVYkQAmh#7#40j~wdmW@JI{eh;7Ufegt-E_up(&db1w zZfkqs@}rE0wL>he9FJuXaP(k84)VHKCO6G77DKHb*O*?NW!(f1uS4DwMhm&}pU}gd zC5@Ra)Hz$2G-Sa2`bRB!)pWgl`MeeKW%T89Kl1ckge~Rp+~44EB)(X21)#8C>21;(zy;|E#pP>#K;gvliA0*G;qxr@^I~W1 z58#iP)Hor%=ce4+7X932UUzl3-KTCsbEjHxeBKGh8yAhr-Jj7V34sMm`_4ZMG&t1+4A=^l+y+V zg&qbO%JO#}`~r+Qh!q<|d~YmAGFbPN$TF=(R=`~ z2GYXxCOYmxEQ5L*l4gMV$?yvhJE&Jt6CH-co@WrLegPgPl|uh9`~t9;ME8M|>b-DX z{_mVG4%8}j{P#h>#V^3e=ZkQQUjRvQ^1``@G5rGc(HMU*Up&oiV}RvCV(s#s`6Arn z7eI*Ixc%>najVXU9DFFM6SdJCt4`0&@%88X&ki7|zsmgib?Bevb!f6r@bf1488(3! z8GqgiKf_jl#a|B9R))nN%y~U@BA@e;q^VxWu2E^egX1WyXhC8XeElAAs9sEqHVCu zj@6A}c_yWXrXEVcA&{gv9%>bvl}5YO6}uv8&;{TREO#f_>KG}HmKRafk+YVeYQZ7`* z=Rmv~odM;6n|7zg6Ai=zrEs!y6v|rx7faC%5u|{p@uneUxZMOdJIGY`;dn)*2KRgN zaL1`$f>hmjxYM56a>bTb1%7YPBl97=Zq>|}iF+P6(Hlfki|uZ_5}Xj}r3{c#y79(D zOrnVBEdc3w1ua+7z;kcVBNCb8RmejN1XTtRRe`5&yu1q6Wjk<%79?JR?}cHl8=u+? z;eD(Uc!-B*0ZaHYAQ9{!Sn*B)n;?-&Dc^wmYLye<$0A-)=(Ov385A$90H~Ii;5I{E z01pI90?_ohSu0er=~j{ukZ!Go%`bx*t*}$7=TA%{q*jF|8t`yeUd>5RQf%j8kF7!> zx-t(>t{1>56fnZ59O50Kd{Mj%-Q7bMAXo38(B&*yehTg%x4Q6d&Wc9Z$dfyGcz+FP zS%x8#aIlj{Y{%qYUW;AKqZg6K>&>HE;jZ&mNZH!jjn`rhED>|$+i*#t3LU2#FM;qa z=f7whh-F1{s+gz-Lu54@@U|RQ)2`Q{msY~|6se}%o~}X_!|lQ(bb%6B>D{;_-Uxu2 z&WpY!$j`UnW^~wnBwk0TfoIb2?nu1`xJ4P20LV+5h2!EAI^L?*4BSjSkuO({maFhT zz;to7jtF1Ynl3!N2|`q1t1316B4)l_XdVqgvp}1#hKlILbCeA{ z(AetU54uVVt$~Rv35L?9#K$0_zeK`^Fp&PvMfc#4Q^P-}fy0hyHU9Y}c%LYG75@1F zJoXcPAOD;NgH5y=|5PyX6#VJL!&nlyQ6%-zvi6g5_LDO9ll%|@+4hrs`#a^}{%(#` zSYAeIE02};fgR@{4W*fwYd;~))g)w3u#EWzDtpoebS-%$>umH4>RY50eTV?9b|8~*ts)TW=V3PMQ& zFIum%(TaWmD&$Gjra`O{$Eb~vBua3!6A8N>|9l4jd=CE%Er&nL@XvSg&kyhqX-|Bc ziabP>$_ldzoha^vQQb?lF4zbWlWd==nyqLM%#*Flllw?Q5aE7>ZBwz@i<{{7bMCgB-cmO93 zFNo_M(u;^$4w=iP5|5KTFXF8o!0Tv-lh18dfP6GZASMeDo|TaU%TBypRo_ITEH75* z9dR5eXb29mJRMbCY6wjS3JsL_^kls%Mg)@dv_zmtJ*<^D%xfi?)@bF!Y^mAC>Dk(3 zSu6%-&M*Ne!UHm({=4x~cxAJSm%QpVm;?^(WZ_SOdVQ#S2nX9j6UJ50tSy*(& - - - - - - Scripts — anton documentation - - - - - - - - - - - - - - - - - - - - - -

-
-
- - -
- -
-

Scripts

-
-

Definer

-
-
-class definer.Anton_OT_Definer
-

Bases: bpy.types.Operator

-
-
-bl_description: str = 'Defines the problem.'
-
- -
-
-bl_idname: str = 'anton.define'
-
- -
-
-bl_label: str = 'Anton_Definer'
-
- -
-
-static compute_area(points)
-
- -
-
-static compute_direction(points)
-
- -
-
-create_geo(path, filename, fixed_faces, no_design_faces, forced_faces, forced_magnitudes, forced_directions, forced_direction_signs, geo_points, geo_edges, points, edges, curve_loop, clmax)
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
-
-static get_curve_loop(surf)
-
- -
-
-static get_edge_indices(surf)
-
- -
-
-static get_raw_data(path)
-
- -
- -
-
-class definer.Anton_OT_DirectionUpdater
-

Bases: bpy.types.Operator

-
-
-bl_idname: str = 'anton.directionupdate'
-
- -
-
-bl_label: str = ''
-
- -
-
-direction_reverse = {}
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
-
-force_id: None
-
- -
- -
-
-definer.draw_arrow(gp_frame, p: tuple, norm: tuple, d: tuple, size: int, reverse: bool)
-
- -
-
-definer.get_grease_pencil(gpencil_obj_name='GPencil') → bpy.types.GreasePencil
-
- -
-
-definer.get_grease_pencil_layer(gpencil: bpy.types.GreasePencil, gpencil_layer_name='GP_Layer', clear_layer=False) → bpy.types.GPencilLayer
-
- -
-
-definer.init_grease_pencil(gpencil_obj_name='GPencil', gpencil_layer_name='Annotation_Layer', clear_layer=True) → bpy.types.GPencilLayer
-
- -
-
-

Initializer

-
-
-class initializer.Anton_OT_ForceUpdater
-

Bases: bpy.types.Operator

-
-
-bl_idname: str = 'anton.forceupdate'
-
- -
-
-bl_label: str = ''
-
- -
-
-diffuse_library = [(1.0, 0.0, 0.7803921568627451, 1), (1.0, 0.9725490196078431, 0.0, 1), (0.3254901960784314, 1.0, 0.0, 1), (0.050980392156862744, 0.8549019607843137, 0.5254901960784314, 1), (0.45098039215686275, 1.0, 0.0, 1), (0.0, 0.8509803921568627, 1.0, 1), (0.9215686274509803, 1.0, 0.0, 1), (1.0, 0.6980392156862745, 0.3254901960784314, 1), (0.5803921568627451, 0.050980392156862744, 0.34509803921568627, 1), (1.0, 0.0, 0.5529411764705883, 1), (1.0, 0.5450980392156862, 0.0, 1)]
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
- -
-
-class initializer.Anton_OT_Initializer
-

Bases: bpy.types.Operator

-
-
-bl_description: str = 'Makes fixed materials and force vertex groups.'
-
- -
-
-bl_idname: str = 'anton.initialize'
-
- -
-
-bl_label: str = 'Anton_Initializer'
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
- -
-
-

Panel

-
-
-class panel.Anton_PT_Panel
-

Bases: bpy.types.Panel

-
-
-bl_category: str = 'anton'
-
- -
-
-bl_idname: str = 'ANTON_PT_panel'
-
- -
-
-bl_label: str = 'anton'
-
- -
-
-bl_region_type: Union[str, int] = 'UI'
-
- -
-
-bl_space_type: Union[str, int] = 'VIEW_3D'
-
- -
-
-draw(context)
-

Draw UI elements into the panel UI layout

-
-
Parameters
-

context ('Context') –

-
-
-
- -
- -
-
-

Preferences

-
-
-class preferences.AntonInstaller
-

Bases: bpy.types.Operator

-
-
-bl_description: str = 'Installs required modules'
-
- -
-
-bl_idname: str = 'anton.installer'
-
- -
-
-bl_label: str = 'Install required modules'
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
- -
-
-class preferences.AntonPreferences
-

Bases: bpy.types.AddonPreferences

-
-
-bl_idname: str = ''
-
- -
-
-draw(context)
-
- -
- -
-
-

Processor

-
-
-class processor.Anton_OT_Processor
-

Bases: bpy.types.Operator

-
-
-bl_description: str = 'Start Optimization'
-
- -
-
-bl_idname: str = 'anton.process'
-
- -
-
-bl_label: str = 'Anton_Processor'
-
- -
-
-static compute_Dmat(v)
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
-
-material_library = {'ABS-Generic': {'POISSON': 0.37, 'YOUNGS': 2300.0}, 'Acrylic-Glass-Generic': {'POISSON': 0.38, 'YOUNGS': 2550.0}, 'AlMg3F24': {'POISSON': 0.3, 'YOUNGS': 70000.0}, 'AlMgSi1F31': {'POISSON': 0.3, 'YOUNGS': 70000.0}, 'AlZn4-5Mg1F35': {'POISSON': 0.3, 'YOUNGS': 70000.0}, 'Aluminum-6061-T6': {'POISSON': 0.33, 'YOUNGS': 69000.0}, 'CalculiX-Steel': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Concrete-EN-C35_45': {'POISSON': 0.17, 'YOUNGS': 32000.0}, 'Concrete-Generic': {'POISSON': 0.17, 'YOUNGS': 32000.0}, 'Glass-Generic': {'POISSON': 0.22, 'YOUNGS': 72000.0}, 'PA6-Generic': {'POISSON': 0.39, 'YOUNGS': 2930.0}, 'PET-Generic': {'POISSON': 0.36, 'YOUNGS': 3150.0}, 'PLA-Generic': {'POISSON': 0.36, 'YOUNGS': 3640.0}, 'PP-Generic': {'POISSON': 0.44, 'YOUNGS': 1470.0}, 'PTFE-Generic': {'POISSON': 0.46, 'YOUNGS': 564.0}, 'PVC-Generic': {'POISSON': 0.38, 'YOUNGS': 2800.0}, 'Reinforcement-FIB-B500': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-15CrNi6': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-17CrNiMo6': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-1C22': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-1C35': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-1C45': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-1C60': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-20NiCrMo2': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-28Mn6': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-2C10': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-30CrNiMo8': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-34CrNiMo6': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-36CrNiMo4': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-36NiCrMo16': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-3C15': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-3C22': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-3C35': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-3V45': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C10': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C15': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C22E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C25E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C30E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C40E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C50E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C55E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-C60E': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E295': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E295-GC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E335': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E335-GC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E360': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-E360-GC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-EN-GJL-100': {'POISSON': 0.3, 'YOUNGS': 88000.0}, 'Steel-EN-GJL-150': {'POISSON': 0.3, 'YOUNGS': 95000.0}, 'Steel-EN-GJL-200': {'POISSON': 0.3, 'YOUNGS': 105000.0}, 'Steel-EN-GJL-250': {'POISSON': 0.3, 'YOUNGS': 115000.0}, 'Steel-EN-GJL-300': {'POISSON': 0.3, 'YOUNGS': 125000.0}, 'Steel-EN-GJL-350': {'POISSON': 0.3, 'YOUNGS': 135000.0}, 'Steel-EN-GJMB-350-10': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMB-550-4': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMB-650-2': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMW-350-4': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMW-360-12': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMW-400-5': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJMW-450-7': {'POISSON': 0.3, 'YOUNGS': 175000.0}, 'Steel-EN-GJS-400-15': {'POISSON': 0.3, 'YOUNGS': 167000.0}, 'Steel-EN-GJS-500-7': {'POISSON': 0.3, 'YOUNGS': 170000.0}, 'Steel-EN-GJS-600-3': {'POISSON': 0.3, 'YOUNGS': 177000.0}, 'Steel-EN-GJS-700-2': {'POISSON': 0.3, 'YOUNGS': 180000.0}, 'Steel-EN-GJS-800-1': {'POISSON': 0.3, 'YOUNGS': 180000.0}, 'Steel-G16Mn5': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G200': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G20Mn5': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G230': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G260': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G300': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-G30Mn5': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-Generic': {'POISSON': 0.3, 'YOUNGS': 200000.0}, 'Steel-S185': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S235JO': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S235JR': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S235JRG1': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S260NC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S275JO': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S275JR': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S275N': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S335JO': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S335JR': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S335N': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S340MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S355J2G3': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S380MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S420MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S420N': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S460MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S460N': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S500MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S550MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-S690MC': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-37-2K': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-E-255': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-E-315': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-E-380': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-E-460': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-St-E-500': {'POISSON': 0.3, 'YOUNGS': 210000.0}, 'Steel-X2CrNiMoN17-13-3': {'POISSON': 0.3, 'YOUNGS': 200000.0}, 'Steel-X2CrNiN24-4': {'POISSON': 0.3, 'YOUNGS': 200000.0}, 'Steel-X39CrMo17-1': {'POISSON': 0.3, 'YOUNGS': 213000.0}, 'Steel-X3CrNiMo13-14': {'POISSON': 0.3, 'YOUNGS': 216000.0}, 'Steel-X5CrNi18-10': {'POISSON': 0.3, 'YOUNGS': 200000.0}, 'Steel-X5CrNiMo17-12-2': {'POISSON': 0.3, 'YOUNGS': 180000.0}, 'Steel-X6CrNiTi18-10': {'POISSON': 0.3, 'YOUNGS': 200000.0}, 'Wood-Generic': {'POISSON': 0.05, 'YOUNGS': 12000.0}}
-
- -
- -
-
-processor.BuildIgJg3DP1VF(me, nq)
-
- -
-
-processor.BuildIkVec(me, nq)
-
- -
-
-processor.ComputeGradientVecTr(q, me)
-
- -
-
-processor.ElemStiffElasMatBa3DP1Vec(nme, q, me, volumes, la, mu)
-
-

Computes all the element elastic stiffness matrices \(\mathbb{K}^e(T_k)\) for :math:`kin{0,hdots,

-
-
-
me-1}`

in local alternate basis.

-
-
param nme
-

number of mesh elements,

-
-
type nme
-

int

-
-
param q
-

mesh vertices,

-
-
type q
-

(3,nq) numpy array of floats

-
-
param me
-

mesh connectivity,

-
-
type me
-

(4,nme) numpy array of integers

-
-
param volumes
-

volumes of all the mesh elements.

-
-
type volumes
-

(nme,) numpy array of floats

-
-
param la
-

the \(\lambda\) Lame parameter,

-
-
type la
-

float

-
-
param mu
-

the \(\mu\) Lame parameter.

-
-
type mu
-

float

-
-
returns
-

a (144*nme,) numpy array of floats.

-
-
-
-
-
- -
-
-

Properties

-
-
-class properties.AntonPropertyGroup
-

Bases: bpy.types.PropertyGroup

-

Base class for dynamically defined sets of properties that are acessed -from :class: Anton_PT_Panel and used by all the operator classes.

-
-
Attributes:

initialized (BoolProperty): A boolean property to check if the problem has been initialzed. -forced (BoolProperty): A boolean property to check if all the forces acting on the model has been defined. -force_directioned (BoolProperty): A boolean property to check if directions for all the specified forces has been defined. -defined (BoolProperty): A boolean property to check if the problem has been defined. -filename (StringProperty): A string property that stores the active object’s name.

-
-
workspace_path (StringProperty): A string property that points at the workspace path

in which temporary variables are created/stored. Defaults to /tmp/

-
-
mode (EnumProperty): A enum property that defines the design space. Choose Shape to use existing geometry as is

for the design space definition or choose HULL to form a geometry around the existing objects. Existing objects are considered -as obstacles and are not included in the design space definition. Defaults to Shape.

-
-
-

number_of_forces (IntProperty): An integer property that defines the number of forces acting on the model.

-
-
-
-
-cl_max: None
-
- -
-
-defined: None
-
- -
-
-density_change: None
-
- -
-
-density_filter: None
-
- -
-
-emin: None
-
- -
-
-filename: None
-
- -
-
-force_directioned: None
-
- -
-
-forced: None
-
- -
-
-include_fixed: None
-
- -
-
-include_forced: None
-
- -
-
-initialized: None
-
- -
-
-keyframes: None
-
- -
-
-material: None
-
- -
-
-metaballrad: None
-
- -
-
-metaballsens: None
-
- -
-
-mode: None
-
- -
-
-number_of_forces: None
-
- -
-
-number_of_iterations: None
-
- -
-
-number_of_neighbours: None
-
- -
-
-penalty_exponent: None
-
- -
-
-rmin: None
-
- -
-
-sensitivity_filter: None
-
- -
-
-slices: None
-
- -
-
-viz_iteration: None
-
- -
-
-volumina_ratio: None
-
- -
-
-workspace_path: None
-
- -
- -
-
-class properties.ForcePropertyGroup
-

Bases: bpy.types.PropertyGroup

-
-
-magnitude: None
-
- -
- -
-
-

Visualizer

-
-
-class visualizer.Anton_OT_Visualizer
-

Bases: bpy.types.Operator

-
-
-static batches(x, n)
-
- -
-
-bl_description: str = 'Visualize results.'
-
- -
-
-bl_idname: str = 'anton.visualize'
-
- -
-
-bl_label: str = 'Anton_Visualizer'
-
- -
-
-execute(context)
-

Execute the operator

-
-
Parameters
-

context ('Context') –

-
-
Return type
-

typing.Union[typing.Set[str], typing.Set[int]]

-
-
Returns
-

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

-
-
-
- -
- -
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 9599973..cf87891 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -37,117 +37,34 @@

Index

A - | B | C | D | E | F - | G | I - | K | M - | N | P - | R - | S | V - | W

A

- -
- -

B

- -
@@ -155,19 +72,7 @@

B

C

-
@@ -175,57 +80,33 @@

C

D

-

E

@@ -234,35 +115,7 @@

E

F

- -
- -

G

- - -
@@ -270,143 +123,59 @@

G

I

-
-

K

- - -
-

M

-

N

- - - -
-

P

-

R

- - -
- -

S

- - - -
-

V

- -
- -

W

- -
@@ -455,8 +210,8 @@

Navigation

diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index 1ed895d..bd0e549 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -61,8 +61,8 @@

Navigation

diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html index b531a76..f99a436 100644 --- a/docs/_build/html/installation.html +++ b/docs/_build/html/installation.html @@ -16,7 +16,7 @@ - + @@ -58,8 +58,8 @@

Navigation

@@ -69,7 +69,7 @@

Related Topics

diff --git a/docs/_build/html/introduction.html b/docs/_build/html/introduction.html index 45251cc..e49281c 100644 --- a/docs/_build/html/introduction.html +++ b/docs/_build/html/introduction.html @@ -58,8 +58,8 @@

Navigation

diff --git a/docs/_build/html/license.html b/docs/_build/html/license.html index b003946..8cc9ac4 100644 --- a/docs/_build/html/license.html +++ b/docs/_build/html/license.html @@ -57,8 +57,8 @@

Navigation

diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 24282647dffaae088c33e551d3ba0c3c04e5f12d..737ef594b4d4774fb5e96d39bda7f8dd3c27ba33 100644 GIT binary patch delta 443 zcmV;s0Yv`k2&4p%bAOeR!A`?442JK0iXgadV&cXPG(boo3WIT+Lh5Z1X;KmwZJc-w zUXLdsZQ3P;jitBR`9J%&-3;bjf+ofKG*?+EfE*LUG%wH$mzaw~mmM6DL6SM`@JynT zv%AOH*uzXvW5}q>{s#@228u9SfU27VE>+g60IYzO2z_a;fqx-a@~Oyd|Gwsb(QziY z5fJP1`cGyPlOs6hhUujhq`=)Kl`lpB| z-?=G!{Ka1G_kTL=l!)lG4UN0W0wk9itcbzvRL~a?WH2Iaw$_pB>ND}OOtDH7D4szu zl>?O9$U#ti1gOlI7GrCO#uY0g`ZTBv_^jpc1 delta 1028 zcmV+f1pE7>1nCHnbAPRv&5qkP5XbL+3Ki{jjRd*n)^w9#iv%^A?e-|pMK`g(nm4n=7tJC;O=zFE}#f28M&q!?sef=_M>=0LC@Y&K1ikI6XpgP^;u{0_y(v8f^|XrIkKHDwHZ$BY@?Q za>+Oavl^nwOUj5{7>UmFf0d|Rn9Ud3h=jaCT9=uZpx4YwH5@^k_@%8%mrF>dG{uOs zz|}ApTcWjkaesoWlD=3*?Oi(LSQQ4+5+vnfr3`~m`<$2;bIBJ?>g+iY{CiOM9a#5n z{p7qjpSZKy;KU6gg(U7gi193|(3OJkHPLl6FCcBNLLSb;w8X^&>9QR!gtk6j7ogSQ z8gc@>TN3H#naT9VuAOD~nC?2+i07}FyT3&->baUtoPRNSkbB3(Aub)$YRFx;wspC7 zc2g4Ut!n|U)lP;{Lk1fATf0-w1hcpH6Fo>{i4c>;G%i|JM$??I2u~t{;yg|WDVj_5 z?%e&M9vsNl|MwweK1~#w8Kr}gq_ypP%Wfzi{gdOerHL|43Ut>rBrI7b7~N&zz92Tp z_17RlIe#~yFWhE|T|aPN?pYryF4#l2We6H zs6(|M1r*;bo;*Hc%6%pF18G(pFnI~u^1znZ8Fy9HJlCJKs>kI1YK}(m*a#l^_da%UBqb{J z4}VD;Rut+*>1TfxDv3RWqnfVmgHb=W;}>}J($u^qXog1-dy#{K#1=?pNk)@k8( zPb@u5e}0`KEID(}vw}|D^O%rx_Y5WA(A+#G#{ z*o}JI2lsQ+o3*ro#or+CCIE?5evbeC`F+2nVJgx3H8k#)7Rq}rXTO->qk(A zMVw*DoNL;_PS8F&YmI41f1IQrf7QH>Y+SpM=4^^~$Qyt04;xJRE8Z&WyY7WI|LUv7 y`)%-cMz*Ulj`CcsLAbBC!Python Module Index - definer + definer   @@ -64,7 +64,7 @@

Python Module Index

- initializer + initializer   @@ -72,22 +72,12 @@

Python Module Index

- panel + processor - preferences - - - - - processor - - - - - properties + properties   @@ -95,7 +85,7 @@

Python Module Index

- visualizer + visualizer @@ -119,8 +109,8 @@

Navigation

diff --git a/docs/_build/html/interface.html b/docs/_build/html/quickstart.html similarity index 85% rename from docs/_build/html/interface.html rename to docs/_build/html/quickstart.html index ac9c2a1..591687f 100644 --- a/docs/_build/html/interface.html +++ b/docs/_build/html/quickstart.html @@ -5,7 +5,7 @@ - Interface — anton documentation + Quickstart — anton documentation @@ -16,7 +16,7 @@ - + @@ -34,8 +34,8 @@
-
-

Interface

+
+

Quickstart

@@ -58,8 +58,8 @@

Navigation

@@ -69,7 +69,7 @@

Related Topics

@@ -103,7 +103,7 @@

Quick search

& Alabaster 0.7.12 | - Page source
diff --git a/docs/_build/html/release.html b/docs/_build/html/release.html index faa1ad3..e90f163 100644 --- a/docs/_build/html/release.html +++ b/docs/_build/html/release.html @@ -17,7 +17,7 @@ - + @@ -58,8 +58,8 @@

Navigation

@@ -68,7 +68,7 @@

Navigation

Related Topics

diff --git a/docs/_build/html/scripts.html b/docs/_build/html/scripts.html new file mode 100644 index 0000000..42683c8 --- /dev/null +++ b/docs/_build/html/scripts.html @@ -0,0 +1,398 @@ + + + + + + + + Scripts — anton documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Scripts

+
+

Properties

+
+
+class properties.AntonPropertyGroup
+

Bases: bpy.types.PropertyGroup

+

A class for dynamically defined sets of properties that are acessed +from Anton_PT_Panel and used by all the operator classes.

+
+
Variables
+
    +
  • initialized (bool) –

  • +
  • forced (bool) –

  • +
  • force_directioned (bool) –

  • +
  • defined (bool) –

  • +
  • filename (str) –

  • +
  • workspace_path (str) –

  • +
  • mode (enum) –

  • +
  • number_of_forces (int) –

  • +
  • include_fixed (bool) –

  • +
  • include_forced (bool) –

  • +
  • density_filter (bool) –

  • +
  • sensitivity_filter (bool) –

  • +
  • cl_max (float) –

  • +
  • rmin (float) –

  • +
  • density_change (float) –

  • +
  • emin (float) –

  • +
  • metaballrad (float) –

  • +
  • metaballsens (float) –

  • +
  • volumina_ratio (float) –

  • +
  • penalty_exponent (float) –

  • +
  • number_of_iterations (int) –

  • +
  • viz_iteration (int) –

  • +
  • keyframes (int) –

  • +
  • slices (int) –

  • +
  • number_of_neighbours (int) –

  • +
  • material (enum) –

  • +
+
+
+
+ +
+
+class properties.ForcePropertyGroup
+

Bases: bpy.types.PropertyGroup

+

A class that holds magnitude of each applied force.

+
+
Variables
+

magnitude (float) –

+
+
+
+ +
+
+

Initializer

+
+
+class initializer.Anton_OT_ForceUpdater
+

Bases: bpy.types.Operator

+

Adds materials and vertex groups corresponding to the number +of forces acting on the model.

+
+
+execute(context)
+

Adds NATIVE, FIXED, NODESIGNSPACE and FORCE_{} materials and +vertex groups DIRECTION_{} to the active object.

+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+ +
+ +
+
+class initializer.Anton_OT_Initializer
+

Bases: bpy.types.Operator

+

Exports the mesh as .stl and imports it back so that each face is a triangle and their indices +match gmsh’s convention.

+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+
+execute(context)
+

Models can be initialized either as SHAPE or HULL. In the case of SHAPE, the existing geometry +is used for design space definition whereas HULL defines a design space with the existing objects as obstacles and +a scaled convexhull as design space boundary.

+
+
Variables
+
    +
  • bound_scale (float) –

  • +
  • objects (list) –

  • +
  • points (numpy.array) –

  • +
  • hull (numpy.array) –

  • +
+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+ +
+ +
+
+

Definer

+
+
+class definer.Anton_OT_Definer
+

Bases: bpy.types.Operator

+

An operator class that creates a tetrahedral finite element mesh of the model with gmsh_api, +interprets the forces acting on the model and stores the required variables as a numpy binary file (.npy).

+
+
+create_geo(path, filename, fixed_faces, no_design_faces, forced_faces, forced_magnitudes, forced_directions, forced_direction_signs, geo_points, geo_edges, points, edges, curve_loop, clmax)
+

Creates a tetrahedral finite element mesh of the model

+
+
Parameters
+
    +
  • path (str) –

  • +
  • filename (str) –

  • +
  • fixed_faces (set) –

  • +
  • no_design_faces (set) –

  • +
  • forced_faces (OrderedDict) –

  • +
  • forced_magnitudes (OrderedDict) –

  • +
  • forced_directions (OrderedDict) –

  • +
  • forced_direction_signs (OrderedDict) –

  • +
  • points (OrderedDict) –

  • +
  • edges (OrderedDict) –

  • +
  • curve_loop (OrderedDict) –

  • +
  • geo_points (OrderedDict) –

  • +
  • geo_edges (OrderedDict) –

  • +
  • clmax (float) –

  • +
+
+
Returns
+

nodes, elements, fixed_nodes, no_design_nodes, forced_nodes, directions, distributed_force

+
+
+
+ +
+
+execute(context)
+

Iterates through all the faces of the model and creates sets of face indices.

+
+
Variables
+
    +
  • nodes (numpy.array) –

  • +
  • elements (numpy.array) –

  • +
  • fixed_nodes (numpy.array) –

  • +
  • no_design_nodes (numpy.array) –

  • +
  • forced_nodes (numpy.array) –

  • +
  • directions (OrderedDict) –

  • +
  • distributed_force (OrderedDict) –

  • +
+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+ +
+ +
+
+class definer.Anton_OT_DirectionUpdater
+

Bases: bpy.types.Operator

+

Visualizes direction vector of applied force with grease pencil

+
+
+execute(context)
+

Instantiates an arrow at the centroid of a face on which force is applied. The instantiated arrow is +a grease pencil object whose color corresponds to the applied force.

+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+ +
+ +
+
+

Processor

+
+
+class processor.Anton_OT_Processor
+

Bases: bpy.types.Operator

+

Solves the optimization problem defined by nodes, elements, fixed, +no_design_nodes, youngs, poisson.

+
+
Returns
+

FINISHED if successful, CANCELLED otherwise

+
+
+
+
+execute(context)
+

Execute the operator

+
+
Parameters
+

context ('Context') –

+
+
Return type
+

typing.Union[typing.Set[str], typing.Set[int]]

+
+
Returns
+

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

+
+
+
+ +
+ +
+
+processor.ElemStiffElasMatBa3DP1Vec(nme, q, me, volumes, la, mu)
+

A function from pyOptFEM, developed at (C) University Paris XIII, Galilee Institute, LAGA, France. +pyOptFEM is a python software package for P_1-Lagrange Finite Element Methods in 3D. The project +maintained by F. Cuvelier, C. Japhet and G. Scarella.

+

For Online Documentation and Download we refer to http://www.math.univ-paris13.fr/~cuvelier

+

Computes all the element elastic stiffness matrices.

+
+
Parameters
+
    +
  • nme (int) – number of mesh elements,

  • +
  • q ((3,nq) numpy array of floats) – mesh vertices,

  • +
  • me ((4,nme) numpy array of integers) – mesh connectivity,

  • +
  • volumes ((nme,) numpy array of floats) – volumes of all the mesh elements.

  • +
  • la (float) – the \(\lambda\) Lame parameter,

  • +
  • mu (float) – the \(\mu\) Lame parameter.

  • +
+
+
Returns
+

a (nme, 144) numpy array of floats.

+
+
+
+ +
+
+

Visualizer

+
+
+class visualizer.Anton_OT_Visualizer
+

Bases: bpy.types.Operator

+
+
+execute(context)
+

Execute the operator

+
+
Parameters
+

context ('Context') –

+
+
Return type
+

typing.Union[typing.Set[str], typing.Set[int]]

+
+
Returns
+

result * RUNNING_MODAL Running Modal, Keep the operator running with blender. * CANCELLED Cancelled, The operator exited without doing anything, so no undo entry should be pushed. * FINISHED Finished, The operator exited after completing its action. * PASS_THROUGH Pass Through, Do nothing and pass the event on. * INTERFACE Interface, Handled but not executed (popup menus).

+
+
+
+ +
+ +
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index a373295..60a1431 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -78,8 +78,8 @@

Navigation

diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 80423f9..a6bfac9 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["anton","index","installation","interface","introduction","license","release"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["anton.rst","index.rst","installation.rst","interface.rst","introduction.rst","license.rst","release.rst"],objects:{"":{definer:[0,0,0,"-"],initializer:[0,0,0,"-"],panel:[0,0,0,"-"],preferences:[0,0,0,"-"],processor:[0,0,0,"-"],properties:[0,0,0,"-"],visualizer:[0,0,0,"-"]},"definer.Anton_OT_Definer":{bl_description:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],compute_area:[0,3,1,""],compute_direction:[0,3,1,""],create_geo:[0,3,1,""],execute:[0,3,1,""],get_curve_loop:[0,3,1,""],get_edge_indices:[0,3,1,""],get_raw_data:[0,3,1,""]},"definer.Anton_OT_DirectionUpdater":{bl_idname:[0,2,1,""],bl_label:[0,2,1,""],direction_reverse:[0,2,1,""],execute:[0,3,1,""],force_id:[0,2,1,""]},"initializer.Anton_OT_ForceUpdater":{bl_idname:[0,2,1,""],bl_label:[0,2,1,""],diffuse_library:[0,2,1,""],execute:[0,3,1,""]},"initializer.Anton_OT_Initializer":{bl_description:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],execute:[0,3,1,""]},"panel.Anton_PT_Panel":{bl_category:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],bl_region_type:[0,2,1,""],bl_space_type:[0,2,1,""],draw:[0,3,1,""]},"preferences.AntonInstaller":{bl_description:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],execute:[0,3,1,""]},"preferences.AntonPreferences":{bl_idname:[0,2,1,""],draw:[0,3,1,""]},"processor.Anton_OT_Processor":{bl_description:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],compute_Dmat:[0,3,1,""],execute:[0,3,1,""],material_library:[0,2,1,""]},"properties.AntonPropertyGroup":{cl_max:[0,2,1,""],defined:[0,2,1,""],density_change:[0,2,1,""],density_filter:[0,2,1,""],emin:[0,2,1,""],filename:[0,2,1,""],force_directioned:[0,2,1,""],forced:[0,2,1,""],include_fixed:[0,2,1,""],include_forced:[0,2,1,""],initialized:[0,2,1,""],keyframes:[0,2,1,""],material:[0,2,1,""],metaballrad:[0,2,1,""],metaballsens:[0,2,1,""],mode:[0,2,1,""],number_of_forces:[0,2,1,""],number_of_iterations:[0,2,1,""],number_of_neighbours:[0,2,1,""],penalty_exponent:[0,2,1,""],rmin:[0,2,1,""],sensitivity_filter:[0,2,1,""],slices:[0,2,1,""],viz_iteration:[0,2,1,""],volumina_ratio:[0,2,1,""],workspace_path:[0,2,1,""]},"properties.ForcePropertyGroup":{magnitude:[0,2,1,""]},"visualizer.Anton_OT_Visualizer":{batches:[0,3,1,""],bl_description:[0,2,1,""],bl_idname:[0,2,1,""],bl_label:[0,2,1,""],execute:[0,3,1,""]},definer:{Anton_OT_Definer:[0,1,1,""],Anton_OT_DirectionUpdater:[0,1,1,""],draw_arrow:[0,4,1,""],get_grease_pencil:[0,4,1,""],get_grease_pencil_layer:[0,4,1,""],init_grease_pencil:[0,4,1,""]},initializer:{Anton_OT_ForceUpdater:[0,1,1,""],Anton_OT_Initializer:[0,1,1,""]},panel:{Anton_PT_Panel:[0,1,1,""]},preferences:{AntonInstaller:[0,1,1,""],AntonPreferences:[0,1,1,""]},processor:{Anton_OT_Processor:[0,1,1,""],BuildIgJg3DP1VF:[0,4,1,""],BuildIkVec:[0,4,1,""],ComputeGradientVecTr:[0,4,1,""],ElemStiffElasMatBa3DP1Vec:[0,4,1,""]},properties:{AntonPropertyGroup:[0,1,1,""],ForcePropertyGroup:[0,1,1,""]},visualizer:{Anton_OT_Visualizer:[0,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","attribute","Python attribute"],"3":["py","method","Python method"],"4":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:attribute","3":"py:method","4":"py:function"},terms:{"050980392156862744":0,"100":0,"105000":0,"115000":0,"12000":0,"125000":0,"135000":0,"144":0,"1470":0,"150":0,"15crni6":0,"167000":0,"170000":0,"175000":0,"177000":0,"17crnimo6":0,"180000":0,"1c22":0,"1c35":0,"1c45":0,"1c60":0,"200":0,"200000":0,"20nicrmo2":0,"210000":0,"213000":0,"216000":0,"2300":0,"250":0,"255":0,"2550":0,"2800":0,"28mn6":0,"2930":0,"2c10":0,"300":0,"30crnimo8":0,"315":0,"3150":0,"32000":0,"3254901960784314":0,"34509803921568627":0,"34crnimo6":0,"350":0,"360":0,"3640":0,"36crnimo4":0,"36nicrmo16":0,"380":0,"3c15":0,"3c22":0,"3c35":0,"3v45":0,"400":0,"450":0,"45098039215686275":0,"460":0,"500":0,"5254901960784314":0,"5450980392156862":0,"550":0,"5529411764705883":0,"564":0,"5803921568627451":0,"5mg1f35":0,"600":0,"6061":0,"650":0,"69000":0,"6980392156862745":0,"700":0,"70000":0,"72000":0,"7803921568627451":0,"800":0,"8509803921568627":0,"8549019607843137":0,"88000":0,"9215686274509803":0,"95000":0,"9725490196078431":0,"boolean":0,"class":0,"default":0,"enum":0,"float":0,"int":0,"return":0,"static":0,"true":0,ABS:0,GJS:0,The:0,acess:0,acryl:0,act:0,action:0,activ:0,addonprefer:0,after:0,all:0,almg3f24:0,almgsi1f31:0,altern:0,aluminum:0,alzn4:0,annotation_lay:0,anton:0,anton_defin:0,anton_initi:0,anton_ot_defin:0,anton_ot_directionupdat:0,anton_ot_forceupdat:0,anton_ot_initi:0,anton_ot_processor:0,anton_ot_visu:0,anton_processor:0,anton_pt_panel:0,anton_visu:0,antoninstal:0,antonprefer:0,antonpropertygroup:0,anyth:0,around:0,arrai:0,attribut:0,b500:0,base:0,basi:0,batch:0,been:0,bl_categori:0,bl_descript:0,bl_idnam:0,bl_label:0,bl_region_typ:0,bl_space_typ:0,blender:[0,1],bool:0,boolproperti:0,bpy:0,buildigjg3dp1vf:0,buildikvec:0,built:1,c10:0,c15:0,c22e:0,c25e:0,c30e:0,c35_45:0,c40e:0,c50e:0,c55e:0,c60e:0,calculix:0,cancel:0,check:0,choos:0,cl_max:0,clear_lay:0,clmax:0,complet:0,comput:0,compute_area:0,compute_direct:0,compute_dmat:0,computegradientvectr:0,concret:0,connect:0,consid:0,context:0,creat:0,create_geo:0,creation:1,curve_loop:0,definit:0,density_chang:0,density_filt:0,design:[0,1],diffuse_librari:0,direct:0,direction_revers:0,directionupd:0,doing:0,draw:0,draw_arrow:0,dynam:0,e295:0,e335:0,e360:0,edg:0,elast:0,element:0,elemstiffelasmatba3dp1vec:0,emin:0,entri:0,enumproperti:0,event:0,execut:0,exist:0,exit:0,fals:0,fib:0,filenam:0,finish:0,fix:0,fixed_fac:0,forc:0,force_direct:0,force_id:0,forced_direct:0,forced_direction_sign:0,forced_fac:0,forced_magnitud:0,forcepropertygroup:0,forceupd:0,form:0,framework:1,from:0,g16mn5:0,g200:0,g20mn5:0,g230:0,g260:0,g300:0,g30mn5:0,gener:[0,1],geo_edg:0,geo_point:0,geometri:0,get_curve_loop:0,get_edge_indic:0,get_grease_pencil:0,get_grease_pencil_lay:0,get_raw_data:0,gjl:0,gjmb:0,gjmw:0,glass:0,gp_frame:0,gp_layer:0,gpencil:0,gpencil_layer_nam:0,gpencil_obj_nam:0,gpencillay:0,greasepencil:0,group:0,handl:0,has:0,hdot:0,hull:0,includ:0,include_fix:0,include_forc:0,init_grease_pencil:0,initialz:0,instal:0,integ:0,interfac:0,intproperti:0,its:0,keep:0,keyfram:0,kin:0,lambda:0,lame:0,layout:0,local:0,magnitud:0,make:0,materi:0,material_librari:0,math:0,mathbb:0,matric:0,menu:0,mesh:0,metaballrad:0,metaballsen:0,modal:0,mode:0,model:0,modul:0,name:0,nme:0,no_design_fac:0,none:0,norm:0,noth:0,number:0,number_of_forc:0,number_of_iter:0,number_of_neighbour:0,numpi:0,object:0,obstacl:0,open:1,oper:0,optim:0,pa6:0,param:0,paramet:0,pass:0,pass_through:0,path:0,penalty_expon:0,pet:0,pla:0,point:0,poisson:0,popup:0,problem:0,process:0,propertygroup:0,ptfe:0,push:0,pvc:0,reinforc:0,requir:0,result:0,revers:0,rmin:0,run:0,running_mod:0,s185:0,s235jo:0,s235jr:0,s235jrg1:0,s260nc:0,s275jo:0,s275jr:0,s275n:0,s335jo:0,s335jr:0,s335n:0,s340mc:0,s355j2g3:0,s380mc:0,s420mc:0,s420n:0,s460mc:0,s460n:0,s500mc:0,s550mc:0,s690mc:0,sensitivity_filt:0,set:0,shape:0,should:0,size:0,slice:0,sourc:1,space:0,specifi:0,start:0,steel:0,stiff:0,store:0,str:0,string:0,stringproperti:0,suit:1,surf:0,t_k:0,temporari:0,through:0,tmp:0,tupl:0,type:0,undo:0,union:0,use:0,used:0,variabl:0,vertex:0,vertic:0,view_3d:0,viz_iter:0,volum:0,volumina_ratio:0,which:0,without:0,wood:0,workspac:0,workspace_path:0,x2crnimon17:0,x2crnin24:0,x39crmo17:0,x3crnimo13:0,x5crni18:0,x5crnimo17:0,x6crniti18:0,young:0},titles:["Scripts","Welcome to anton\u2019s documentation!","Installation","Interface","Introduction","License","Releases"],titleterms:{anton:1,defin:0,document:1,initi:0,instal:2,interfac:3,introduct:4,licens:5,panel:0,prefer:0,processor:0,properti:0,releas:6,script:0,visual:0,welcom:1}}) \ No newline at end of file +Search.setIndex({docnames:["index","installation","introduction","license","quickstart","release","scripts"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["index.rst","installation.rst","introduction.rst","license.rst","quickstart.rst","release.rst","scripts.rst"],objects:{"":{definer:[6,0,0,"-"],initializer:[6,0,0,"-"],processor:[6,0,0,"-"],properties:[6,0,0,"-"],visualizer:[6,0,0,"-"]},"definer.Anton_OT_Definer":{create_geo:[6,2,1,""],execute:[6,2,1,""]},"definer.Anton_OT_DirectionUpdater":{execute:[6,2,1,""]},"initializer.Anton_OT_ForceUpdater":{execute:[6,2,1,""]},"initializer.Anton_OT_Initializer":{execute:[6,2,1,""]},"processor.Anton_OT_Processor":{execute:[6,2,1,""]},"visualizer.Anton_OT_Visualizer":{execute:[6,2,1,""]},definer:{Anton_OT_Definer:[6,1,1,""],Anton_OT_DirectionUpdater:[6,1,1,""]},initializer:{Anton_OT_ForceUpdater:[6,1,1,""],Anton_OT_Initializer:[6,1,1,""]},processor:{Anton_OT_Processor:[6,1,1,""],ElemStiffElasMatBa3DP1Vec:[6,3,1,""]},properties:{AntonPropertyGroup:[6,1,1,""],ForcePropertyGroup:[6,1,1,""]},visualizer:{Anton_OT_Visualizer:[6,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"144":6,"case":6,"class":6,"enum":6,"export":6,"float":6,"function":6,"import":6,"int":6,"return":6,For:6,The:6,acess:6,act:6,action:6,activ:6,add:6,after:6,all:6,anton_ot_defin:6,anton_ot_directionupdat:6,anton_ot_forceupdat:6,anton_ot_initi:6,anton_ot_processor:6,anton_ot_visu:6,anton_pt_panel:6,antonpropertygroup:6,anyth:6,appli:6,arrai:6,arrow:6,back:6,base:6,binari:6,blender:[0,6],bool:6,bound_scal:6,boundari:6,bpy:6,built:0,can:6,cancel:6,centroid:6,cl_max:6,clmax:6,color:6,complet:6,comput:6,connect:6,context:6,convent:6,convexhul:6,correspond:6,creat:6,create_geo:6,creation:0,curve_loop:6,cuveli:6,definit:6,density_chang:6,density_filt:6,design:[0,6],develop:6,direct:6,direction_:6,distributed_forc:6,document:6,doing:6,download:6,dynam:6,each:6,edg:6,either:6,elast:6,element:6,elemstiffelasmatba3dp1vec:6,emin:6,entri:6,event:6,execut:6,exist:6,exit:6,face:6,file:6,filenam:6,finish:6,finit:6,fix:6,fixed_fac:6,fixed_nod:6,forc:6,force_:6,force_direct:6,forced_direct:6,forced_direction_sign:6,forced_fac:6,forced_magnitud:6,forced_nod:6,forcepropertygroup:6,framework:0,franc:6,from:6,galile:6,gener:0,geo_edg:6,geo_point:6,geometri:6,gmsh:6,gmsh_api:6,greas:6,group:6,handl:6,hold:6,http:6,hull:6,include_fix:6,include_forc:6,indic:6,instanti:6,institut:6,integ:6,interfac:6,interpret:6,iter:6,its:6,japhet:6,keep:6,keyfram:6,laga:6,lagrang:6,lambda:6,lame:6,list:6,magnitud:6,maintain:6,match:6,materi:6,math:6,matric:6,menu:6,mesh:6,metaballrad:6,metaballsen:6,method:6,modal:6,mode:6,model:6,nativ:6,nme:6,no_design_fac:6,no_design_nod:6,node:6,nodesignspac:6,noth:6,npy:6,number:6,number_of_forc:6,number_of_iter:6,number_of_neighbour:6,numpi:6,object:6,obstacl:6,onlin:6,open:0,oper:6,optim:6,ordereddict:6,otherwis:6,p_1:6,packag:6,paramet:6,pari:6,paris13:6,pass:6,pass_through:6,path:6,penalty_expon:6,pencil:6,point:6,poisson:6,popup:6,problem:6,project:6,propertygroup:6,push:6,pyoptfem:6,python:6,refer:6,requir:6,result:6,rmin:6,run:6,running_mod:6,scale:6,scarella:6,sensitivity_filt:6,set:6,shape:6,should:6,slice:6,softwar:6,solv:6,sourc:0,space:6,stiff:6,stl:6,store:6,str:6,success:6,suit:0,tetrahedr:6,through:6,triangl:6,type:6,undo:6,union:6,univ:6,univers:6,used:6,variabl:6,vector:6,vertex:6,vertic:6,viz_iter:6,volum:6,volumina_ratio:6,wherea:6,which:6,whose:6,without:6,workspace_path:6,www:6,xiii:6,young:6},titles:["Welcome to anton\u2019s documentation!","Installation","Introduction","License","Quickstart","Releases","Scripts"],titleterms:{anton:0,defin:6,document:0,initi:6,instal:1,introduct:2,licens:3,processor:6,properti:6,quickstart:4,releas:5,script:6,visual:6,welcom:0}}) \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index e6327a8..6fe25a5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -17,8 +17,8 @@ anton is a generative design framework built on Blender, the open-source 3D crea introduction installation - interface - anton + quickstart + scripts release license diff --git a/docs/interface.rst b/docs/interface.rst deleted file mode 100644 index 914293a..0000000 --- a/docs/interface.rst +++ /dev/null @@ -1,2 +0,0 @@ -Interface -========= \ No newline at end of file diff --git a/docs/quickstart.rst b/docs/quickstart.rst new file mode 100644 index 0000000..e397aa5 --- /dev/null +++ b/docs/quickstart.rst @@ -0,0 +1,2 @@ +Quickstart +========== \ No newline at end of file diff --git a/docs/_build/html/_sources/anton.rst.txt b/docs/scripts.rst similarity index 61% rename from docs/_build/html/_sources/anton.rst.txt rename to docs/scripts.rst index 4380a9a..bb839aa 100644 --- a/docs/_build/html/_sources/anton.rst.txt +++ b/docs/scripts.rst @@ -1,59 +1,42 @@ Scripts ======= -Definer --------------------- +Properties +----------------------- -.. automodule:: definer +.. automodule:: properties :members: - :undoc-members: :show-inheritance: + Initializer ------------------------ .. automodule:: initializer :members: - :undoc-members: :show-inheritance: -Panel ------------------- -.. automodule:: panel - :members: - :undoc-members: - :show-inheritance: - -Preferences ------------------------- +Definer +-------------------- -.. automodule:: preferences +.. automodule:: definer :members: - :undoc-members: :show-inheritance: + Processor ---------------------- .. automodule:: processor :members: - :undoc-members: :show-inheritance: -Properties ------------------------ - -.. automodule:: properties - :members: - :undoc-members: - :show-inheritance: Visualizer ----------------------- .. automodule:: visualizer :members: - :undoc-members: :show-inheritance: diff --git a/initializer.py b/initializer.py index f199e48..37fe335 100644 --- a/initializer.py +++ b/initializer.py @@ -4,6 +4,9 @@ from scipy.spatial import ConvexHull class Anton_OT_ForceUpdater(bpy.types.Operator): + """Adds materials and vertex groups corresponding to the number + of forces acting on the model. + """ bl_idname = "anton.forceupdate" bl_label = "" @@ -21,6 +24,11 @@ class Anton_OT_ForceUpdater(bpy.types.Operator): (255/255, 139/255, 0/255, 1)] def execute(self, context): + """Adds ``NATIVE``, ``FIXED``, ``NODESIGNSPACE`` and ``FORCE_{}`` materials and + vertex groups ``DIRECTION_{}`` to the active object. + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ scene = context.scene active_object = bpy.context.active_object @@ -42,7 +50,7 @@ def execute(self, context): for i in range(scene.anton.number_of_forces): if str('FORCE_{}'.format(i+1)) not in bpy.data.materials: - #TAKE CARE OF POPPING EXCESS FORCES + # Take care of popping of excess forces size = len(scene.forceprop) new = scene.forceprop.add() new.name = str(size+1) @@ -64,11 +72,31 @@ def execute(self, context): return{'CANCELLED'} class Anton_OT_Initializer(bpy.types.Operator): + """Exports the mesh as .stl and imports it back so that each face is a triangle and their indices + match gmsh's convention. + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ bl_idname = 'anton.initialize' bl_label = 'Anton_Initializer' bl_description = 'Makes fixed materials and force vertex groups.' def execute(self, context): + """Models can be initialized either as `SHAPE` or `HULL`. In the case of `SHAPE`, the existing geometry + is used for design space definition whereas `HULL` defines a design space with the existing objects as obstacles and + a scaled convexhull as design space boundary. + + :ivar bound_scale: + :vartype bound_scale: float + :ivar objects: + :vartype objects: list + :ivar points: + :vartype points: numpy.array + :ivar hull: + :vartype hull: numpy.array + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ scene = context.scene active_object = bpy.context.active_object bpy.context.space_data.shading.type = 'MATERIAL' diff --git a/processor.py b/processor.py index 5eeab0f..2517e73 100644 --- a/processor.py +++ b/processor.py @@ -71,8 +71,13 @@ def ComputeGradientVecTr(q,me): def ElemStiffElasMatBa3DP1Vec(nme,q,me,volumes,la,mu): """ - Computes all the element elastic stiffness matrices :math:`\mathbb{K}^e(T_k)` for :math:`k\in\{0,\hdots,\nme-1\}` - in local *alternate* basis. + A function from pyOptFEM, developed at (C) University Paris XIII, Galilee Institute, LAGA, France. + pyOptFEM is a python software package for P_1-Lagrange Finite Element Methods in 3D. The project + maintained by **F. Cuvelier**, **C. Japhet** and **G. Scarella**. + + For Online Documentation and Download we refer to http://www.math.univ-paris13.fr/~cuvelier + + Computes all the element elastic stiffness matrices. :param nme: number of mesh elements, :type nme: int @@ -86,7 +91,7 @@ def ElemStiffElasMatBa3DP1Vec(nme,q,me,volumes,la,mu): :type la: float :param mu: the :math:`\\mu` Lame parameter. :type mu: float - :returns: a ``(144*nme,)`` *numpy* array of floats. + :returns: a ``(nme, 144)`` *numpy* array of floats. """ ndf2=144; G=ComputeGradientVecTr(q,me) @@ -297,6 +302,11 @@ def ElemStiffElasMatBa3DP1Vec(nme,q,me,volumes,la,mu): ################################################## class Anton_OT_Processor(bpy.types.Operator): + """Solves the optimization problem defined by ``nodes``, ``elements``, ``fixed``, + ``no_design_nodes``, ``youngs``, ``poisson``. + + :return: ``FINISHED`` if successful, ``CANCELLED`` otherwise + """ bl_idname = 'anton.process' bl_label = 'Anton_Processor' bl_description = 'Start Optimization' diff --git a/properties.py b/properties.py index cb4adb8..eadf22b 100644 --- a/properties.py +++ b/properties.py @@ -2,6 +2,11 @@ from bpy.props import StringProperty, IntProperty, FloatProperty, EnumProperty, BoolProperty class ForcePropertyGroup(bpy.types.PropertyGroup): + """A class that holds magnitude of each applied force. + + :ivar magnitude: + :vartype magnitude: float + """ magnitude : FloatProperty( name="N", @@ -12,23 +17,67 @@ class ForcePropertyGroup(bpy.types.PropertyGroup): class AntonPropertyGroup(bpy.types.PropertyGroup): - """Base class for dynamically defined sets of properties that are acessed - from :class: `Anton_PT_Panel` and used by all the operator classes. - - Attributes: - initialized (BoolProperty): A boolean property to check if the problem has been initialzed. - forced (BoolProperty): A boolean property to check if all the forces acting on the model has been defined. - force_directioned (BoolProperty): A boolean property to check if directions for all the specified forces has been defined. - defined (BoolProperty): A boolean property to check if the problem has been defined. - filename (StringProperty): A string property that stores the active object's name. - - workspace_path (StringProperty): A string property that points at the workspace path - in which temporary variables are created/stored. Defaults to /tmp/ - mode (EnumProperty): A enum property that defines the design space. Choose `Shape` to use existing geometry as is - for the design space definition or choose `HULL` to form a geometry around the existing objects. Existing objects are considered - as obstacles and are not included in the design space definition. Defaults to `Shape`. - - number_of_forces (IntProperty): An integer property that defines the number of forces acting on the model. + """A class for dynamically defined sets of properties that are acessed + from **Anton_PT_Panel** and used by all the operator classes. + + :ivar initialized: + :vartype initialized: bool + :ivar forced: + :vartype forced: bool + :ivar force_directioned: + :vartype force_directioned: bool + :ivar defined: + :vartype defined: bool + + :ivar filename: + :vartype filename: str + :ivar workspace_path: + :vartype workspace_path: str + :ivar mode: + :vartype mode: enum + :ivar number_of_forces: + :vartype number_of_forces: int + + :ivar include_fixed: + :vartype include_fixed: bool + :ivar include_forced: + :vartype include_forced: bool + :ivar density_filter: + :vartype density_filter: bool + :ivar sensitivity_filter: + :vartype sensitivity_filter: bool + + :ivar cl_max: + :vartype cl_max: float + :ivar rmin: + :vartype rmin: float + :ivar density_change: + :vartype density_change: float + :ivar emin: + :vartype emin: float + + :ivar metaballrad: + :vartype metaballrad: float + :ivar metaballsens: + :vartype metaballsens: float + :ivar volumina_ratio: + :vartype volumina_ratio: float + :ivar penalty_exponent: + :vartype penalty_exponent: float + + :ivar number_of_iterations: + :vartype number_of_iterations: int + :ivar viz_iteration: + :vartype viz_iteration: int + :ivar keyframes: + :vartype keyframes: int + :ivar slices: + :vartype slices: int + :ivar number_of_neighbours: + :vartype number_of_neighbours: int + + :ivar material: + :vartype material: enum """ initialized : BoolProperty(default=False)