From b6f9a00a40e37f4be14033b428142fd27d34720d Mon Sep 17 00:00:00 2001 From: Rentlau Date: Sun, 8 Mar 2015 16:04:57 +0100 Subject: [PATCH] Release of 2015-03-08 : New icon for the macro WORK FEATURE : Addition : into Ori. Pref. TAB : Possibility to set the tolerance (ie for comparison with Zero) into Axis TAB : Create an Axis Perpendicular to an Axis, crossing a Point and Parallel to a Plane. -Select one Plane, one Axis and one Point ON the previous Axis. into Circle TAB : Create Arcs: Cut the selected Circle(s) or Arc(s) in 2(n) parts and create 2(n) Arcs. The number indicates in how many parts to cut. - First select as many Circles and Arcs you want - Second set the number of parts - Third push this button The function is not yet developped for Cylinders. Correction : into Check TAB: Functions Parallel, Perpendicular and coplanar available for two faces or two Edges --- WorkFeature/Doc/WF_documentation.pdf | Bin 0 -> 106588 bytes WorkFeature/WFGui_2015.py | 373 +++++++------- WorkFeature/WFGui_2015.ui | 397 +++++++++------ WorkFeature/WF_centerObjectsPlanes.png | Bin 6051 -> 0 bytes WorkFeature/WF_wf.svg | 417 ++++++++++++++++ WorkFeature/__init__.py | 644 +++++++++++++++++++++---- 6 files changed, 1434 insertions(+), 397 deletions(-) create mode 100644 WorkFeature/Doc/WF_documentation.pdf delete mode 100755 WorkFeature/WF_centerObjectsPlanes.png create mode 100644 WorkFeature/WF_wf.svg diff --git a/WorkFeature/Doc/WF_documentation.pdf b/WorkFeature/Doc/WF_documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5749aa210e09692707da9d31dfe706ccf685e626 GIT binary patch literal 106588 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

+W`7m+t%g4O@$bgs6vjKl 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

%$6snhY#kV15!cuoc{VMt!O4l@^Ka;vXO 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 0 0 - 386 - 767 + 387 + 838 @@ -59,8 +59,8 @@ 0 0 - 350 - 765 + 351 + 813 @@ -76,14 +76,14 @@ W. F. - - + + QTabWidget::West - 8 + 1 @@ -139,6 +139,30 @@ + + + + + + Tolerance + + + + + + + + 60 + 16777215 + + + + 1e-10 + + + + + @@ -153,7 +177,7 @@ 20 - 539 + 40 @@ -574,7 +598,7 @@ Then click on this button. Axis - + @@ -780,7 +804,8 @@ then click on a location on the selected object. - Create an Axis parallel to an Axis and crossing a Point. + Create an Axis Parallel to an Axis and crossing a Point. +-Select one Axis and one Point NOT on the previous Axis. Axis=(Point,Axis) @@ -844,7 +869,8 @@ End of the line. - Create an Axis perpendicular to an Axis and crossing a Point. + Create an Axis Perpendicular to an Axis and crossing a Point +-Select one Axis and one Point NOT on the previous Axis. Axis=(Axis,Point) @@ -882,7 +908,8 @@ End of the line. - Create an Axis between 2 Axes. + Create an Axis between two Axes. +-Select two Axes. Axis=(Line,Line) @@ -900,6 +927,27 @@ End of the line. + + + Create an Axis Perpendicular to an Axis, crossing a Point and Parallel to a Plane. +-Select one Plane, one Axis and one Point ON the previous Axis. + + + Axis=(Plane,Point,Axis) + + + + ../Icons/WF_planeLinePointAxis.svg../Icons/WF_planeLinePointAxis.svg + + + + 32 + 32 + + + + + @@ -953,7 +1001,7 @@ The number indicates in how many parts to cut. - + Create an Axis on a Plane by projection from anoher Axis. @@ -973,7 +1021,7 @@ The number indicates in how many parts to cut. - + Create an Axis by intersect of 2 Planes. @@ -993,7 +1041,7 @@ The number indicates in how many parts to cut. - + Create a set of Lines on a Plane perpendicular to the view at location of 2 mouse clicks. @@ -1015,7 +1063,7 @@ The number indicates in how many parts to cut. - + Create 3 Axes at Base location of all selected Object(s). @@ -1035,7 +1083,7 @@ The number indicates in how many parts to cut. - + Transform Line(s) in Sketch's Line(s) by projection onto the Sketch's Plane: @@ -1069,46 +1117,6 @@ Then click on this button. Circle - - - - Select 3 Points to create a Circle. - - - Circle=(3 points) - - - - ../Icons/WF_3pointsCircle.svg../Icons/WF_3pointsCircle.svg - - - - 32 - 32 - - - - - - - - Select a center and 2 Points to create an Ellipse. - - - Ellipse=(3 points) - - - - ../Icons/WF_3pointsEllipse.svg../Icons/WF_3pointsEllipse.svg - - - - 32 - 32 - - - - @@ -1130,6 +1138,83 @@ centered on the Axis and tangenting the Point. + + + + + + Create Arcs: +Cut the selected Circle(s) or Arc(s) in 2(n) parts and create 2(n) Arcs. +The number indicates in how many parts to cut. +- First select as many Circles and Arcs you want +- Second set the number of parts +- Third push this button + + + Arcs=Cut(Circle) + + + + ../Icons/WF_cutCircle.svg../Icons/WF_cutCircle.svg + + + + 32 + 32 + + + + + + + + + 40 + 0 + + + + + 50 + 16777215 + + + + The number indicates in how many parts the selected Circle will be cut. + + + 2 + + + 10 + + + 1 + + + + + + + + + Select 3 Points to create a Circle. + + + Circle=(3 points) + + + + ../Icons/WF_3pointsCircle.svg../Icons/WF_3pointsCircle.svg + + + + 32 + 32 + + + + @@ -1179,7 +1264,27 @@ with the given radius. - + + + Select a center and 2 Points to create an Ellipse. + + + Ellipse=(3 points) + + + + ../Icons/WF_3pointsEllipse.svg../Icons/WF_3pointsEllipse.svg + + + + 32 + 32 + + + + + + Qt::Vertical @@ -1242,26 +1347,6 @@ with the given radius. - - - - Create 3 Planes (XY, XZ and YZ) at center location of all selected Object(s). - - - Object(s) Center Planes - - - - Icons/WF_centerObjectsPlanes.svgIcons/WF_centerObjectsPlanes.svg - - - - 32 - 32 - - - - @@ -1282,52 +1367,6 @@ with the given radius. - - - - - - Create a plane crossing a Point and parallel to a Plane. - - - Plane=(Point, Plane) - - - - Icons/WF_pointPlanePoint.svgIcons/WF_pointPlanePoint.svg - - - - 32 - 32 - - - - - - - - - 40 - 0 - - - - - 60 - 16777215 - - - - Distance for the extensions of the new Plane compared to initial one. - - - 0.0 - - - - - @@ -1417,6 +1456,65 @@ then click on a location on the selected object. + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Create a plane crossing a Point and parallel to a Plane. + + + Plane=(Point, Plane) + + + + Icons/WF_pointPlanePoint.svgIcons/WF_pointPlanePoint.svg + + + + 32 + 32 + + + + + + + + + 40 + 0 + + + + + 60 + 16777215 + + + + Distance for the extensions of the new Plane compared to initial one. + + + 0.0 + + + + + @@ -1475,6 +1573,26 @@ then click on a location on the selected object. + + + + Create 3 Planes (XY, XZ and YZ) at center location of all selected Object(s). + + + Object(s) Center Planes + + + + Icons/WF_centerObjectsPlanes.svgIcons/WF_centerObjectsPlanes.svg + + + + 32 + 32 + + + + @@ -1580,19 +1698,6 @@ Define the width and the length of the Plane if needed. - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -2231,12 +2336,12 @@ and push this button to accept... - Check if two faces are Perpendicular: -- Select the 2 faces/planes and + Check if two faces or two Edges are Perpendicular: +- Select the 2 faces/planes or 2 Edges/Lines and Click this button - Faces Perpendicular + are Perpendicular ? @@ -2253,12 +2358,12 @@ Click this button - Check if two faces are Parallel: -- Select the 2 faces/planes and + Check if two faces or two Edges are Parallel: +- Select the 2 faces/planes or 2 Edges/Lines and Click this button - Faces Parallel + are Parallel ? @@ -2275,12 +2380,12 @@ Click this button - Check if two faces are Coplanar: -- Select the 2 faces/planes and + Check if two faces or two Edges are Coplanar: +- Select the 2 faces/planes or 2 Edges/Lines and Click this button - Faces Coplanar + are Coplanar ? diff --git a/WorkFeature/WF_centerObjectsPlanes.png b/WorkFeature/WF_centerObjectsPlanes.png deleted file mode 100755 index 16288ee1eab998a528e62db64a19a10ba29c1368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6051 zcmV;U7hLFxP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2i^=8 z2^0dG6TeFU02d=kL_t(|+U1*RbX@0o-+%ADv+pw)Y=fNu2@)Vkil7#*vPk)mAw{KH zNH$UwxpphNX`P(LZciQZG)hD|ZJOkq)J=M9rLiqps!7V0WJ{tdE|$ejB)9^^zVACQ z`#$&f!vG{m0u(^dADlj)NY2cA-{*gy<^O-)mxA9y+rN)LMCI?N{`$h9BmAHHT}%3H zbN;{{o<`+=Xl3F6s)|_5dcRcw?BByCRdB>?B(U`nJ_SH5&IjqY=*^c4iT8CnQZMb~ zL#vs{|2F{q>F<%PN_;FNtj|BevHVQ@(;FB6+*9D&FJYEad?=uB=Xy?5lrRFIf(ju1 zIY+>&UqYjgaae`w$13>zv6Xb)+_*>sfU-CrH1{2rd-)Eq7C0IR@c#FX5qr=8B(nK? zRCX<2LhY{2T%Y-wm;ykN7MB9|1;GBjyapVQ1d5{ayxofTPxtbckoeJ|pK|GeRQ$bs z8u?%bdIO^J%ZeVk6+d9-dbP-xTmGA$a$-!?z2MV)k|5v*?QP+m& zQX>_;BYZ&NN18@EHn}p`s?zXBDA6pCrzwsRJIV?nH`(9HwSwA_(b3)}04<6-z-9G?(c^&xI zUw?+T>sl#l>0`;5mz*@n_*D2r6?`Biv8poPbK4pE#&djN(2<;L(ar%}7wcKp+(UUh zfk_DbD!eaL-Z*%KlW_MN1^CW$ESEH#(`nIv^(o%X&%!^~Gn#wIeDfoo7x3>79=S=2 z@1q6?1S;fZ<15Ifb|=(M_%U85DDf~+;^FgH zf|{$%6x6n|tapSLRe0&ZKAKVaX+q_n{@YP{ZdUv~J_vV=Q26lTA2>QJ2z3ga}%}AJ!D>LpuD}0jqxN;3PBPT&7&*1{%8f=^U7Um zYR_V^JYbFmd?DPOgY1+9EH9$lXh^HCsxksqWdsxj(J_Frt_@pr54Ni`%L^GTFJv^9;QSBXW#{k&`AhO3%gO3%Efm@!g&wJe`-Sw3N4XkZL|Z7cSMPHc@`R5f-{ zWjaGJFN>b?Lb|If=+R2Ix(2|<=UFv8LH@Er{QJJl;K(G72_KHpNgf;Z@~BZyzuQ4W zb_SgixBpg>r-%>_AOggUsvL@7ZRuq<3c9iadTge--@;7uxQTh(jOox(=*O-PpPYSk~Fkvf~#?DGIVygR-I+e=LrqHIkbCy~Rk>lE*+I#qhWn z+vp@te~=1)kP2BQ|Mx*HuBkDbGO>>Om+iLEHczqTB&(~jEMNogX1$Z|4X>|rPzMc>wk3vdBD zHG=N_dub4GloW3r{28tDFM=Q=&_rWo=eQZk&0yj;;e0HC^y3dH3dhiR+|V})l7JEq z$r2CAr#2Jr8bEWS9bJ7Vx--|wJae5)n;CL5pkfLBVh=+ACIhkD48{T1iel;vI$|xo zl!YSv88Ux%6AZzd2M^Q!MJe#QEHIQ8p=3IkoUP(7))WQt#)lO4jbhrqo=7N)cH9T+ ztB4x)H;WlgD@u70iH)m?mgJHY0^O(=F*puQUFfg3V)q5nSWF~k2|m9;Mo})^&pyGW z&1<+(;-LeTs6RweBFPTmkG52@cXK7yZB=xBdV|1hT0qrlVaNJ3Ll+XN)kH8qixG=) zb|JD*J8}X~Z5z%FtB7u0N9>&w*qeIbTQA^s+HP-eH+e`9dn|!0OQa$(LQP$0YunIG z_>ln|R^r|Oy7B@VUfRX4XVVIo8Yu4^pd=c{GA+(fIjW>M^4*^^2p|r=L;x`ShZpD{ zogi}}fGLr<+3OXnnP71aLweopboYzw_(j~mzCw0YDe=8e5{xB~kDkQd+zo&7B3_sE zZUFotY|%IxNuXpn@Xc(~!xPALZRoDIp`Y}pJHSlxRaKUDY}!&uq-$;D)wWUEGek)u zi2*?Zl}~`9^0S-yMl^kErgBkr z+Zl7)8A~c?hR4Vn4`7Q%(G8B0Jvc_TQAZ@#%~*y5|6EwK^AFeF1!`3pgH>e= zCX$@H(oBIyo!->!Z7Z3V#Xw#b1K}vfp$W3Q0nCvY#*Tgpx&~1!CPH`Ci{S}$hmTXJ z)1m&sE`k>0Z2;dr*8;*ZOrZ#R0H+PVBxbJ-0MR&dYY!G7p}K5o**wiew?D>6_fT4+ zGW#76OWMi4^A&*}a+Jo?#4it=Jp8v0iVbx~`pv{^N`M$ZAe^JB_L$?iFgY z4I?vbcr$ExlPRQ;N!;T;9FZ8>!BJfA)Zz-q;JGJ==Vi_92vfuTSOR?@j1j8Xn z=-)U-u|I@n+d9Z~qZ^$>r;$jRO+<8B5(3njk4mJ_`hu7M>}G;G?cALvkwj|j#u`r| zmFCgov=LnBesyv>t!55cHPb{T8b>nd=FYn>vJcOZF))f|<0_&XR+EgxFvJsRk_xgf zhy_5WA)(jZB3gkkCWjR)M#6esdfqUr^C_gpF08Q_@{)XdGwgR0n)#SIBTa6~YPXH? zPz3FN{|U=JI77BCxbU-rPcD#I*M@V|Qer#S6V_{qJ1qF!4!jm45qWA35Kp4@2eC|V zAgO@KK-6TIn{Xvl>9CK+kc)HaciZnhE1VAi(u|asfA$)yG9C1fdNDV4;W=N6yK4}m z(?;B3ojV_I_WF7pCoYm(;vwym~niixEXp5lvlK!x1$3Sqwc;ktXIi8e3Yx*wO+{4vbRstIMov>1D;? z6BM4hMD(#$j6b{_pENa$>>I&w^b`d~1M2VZBw*CtyOSs?(z~ayUvEW}cwprcs9K6Y z7Dv9?g5gRN^6?AkPh3D>kb_c~gX*v#=VmhM$z=RN_&rU$rhNdAUwxTfcYe`oCbp`K zp4CffjK)azjgsBaf%9?`_GA)a(4)NZ5yhz#(pR1$nC-fEyHix8cYlTbS}S5%5y=g! zkYaJjauKzeNR)VpJyu1m*aJvN?R`jH14vy1;0qyJj3iyQxr^j{t+^X(|0t%7Yq)CA zruTf$g6Fakd2TB;PbIi=wwAJ*da94tkaOY^Dj@cKnNWV#z3YSu;@DYiS6dKE3rM}V z9e+nZu2~K`lqGpY+;*f#D$up{l4$HiZt2F*(oLbwj9OkyaLXEoo!0x4?9)A1QWtnS ztk;s-T21qp*3$AnkMi`$1fG?p5Q$=L??;p8CTh^%9R(_gkI!L0e*>vFm(&Z}@ypWO zQ_MgZQ!IhbYR30OHGNN1L*EFt%T2g%v}3HP$9km^t0$9WRVluQD;d$s^Kad1>h=`q z9Kf}pmL~~Re+Wl@CgI=N!0_NG?r|^HaW8tCg+yK^5vwU35h{q|7qFeJMJmied3h&( zt>*SRG4og}7{L^cq1S2g+s*V(|9gHG{`@TbyEh@4x^dJrkkQ_UzIT|6Qj6DwA#6gWH5p$9L1p35U^Y5n~j=F5^6;WlNBXQh9byUnsHxg!r9P? zuCbGBmyPVw0-_IBGMeoqFx!#3IwSawoM3Y(jAP*dNGPg$YZPrU5-rQ8KNe$TXad)$ z7uU%eEVXTreOx7E|XC#&8saRwn4M(mNkrVm6Z6yoTY;YZ&ey!+52U z%wfLLDU?{geyA+Y1Ij2vR8}J(jwyPUuM# z<}%#ag{ig;lhX=MZ$X5k*i@C6(Ln5`#1%J{oi3HapwSR=TIpc{qHNmo+(hy=)3aj( zqOJ}5)fO_k1~K#wVLwxgy)cK=>ZSNfav7gq{L?FJM$i=1@rvf>pHjX3QR>Xb`L!8I zprn-9>)5Fp3eVPJa#~6Ko8P5fBV!K5aEGE8!!Zm-J+YazHxk8QG7xrJ?$7y|rj=3G zmg8Mpj@K7NQ`11kwN{+<9moxxxZHMJvYal|O8Sb~i+}wlA$e&wub;oc%8?251-Xn) z_s6;H{0%B(f&S5zx6{%y*C{x437g4?^3|v4aN0;{HAIaDCS{3OQb8Y2V2H%f`+|r> z66`i&nGU*yxPK8gn;CQ{OY#Vo0czutF8+*Utdp^Ljj=e2zn}L;dP*It!?C(sw=Fsj$x9uXJnSgxuV*H@*v`RDa`j-A74(4v0rY1(sKbCVQr z07L%>PFX|HVWBk~!!_y0H8P1qQ4mHwF_;+PDOJu-xq< z6TWx?!|8fny$gVuKy2N^50p_ZD=KS-#(AiwffZw3v_(0LU2CBTZeY`9w98d*C20a0tOfr_luBu29 zs4wlJyC`Sw*_yk|4vz1K5?5$pq_RCz;GpdcIcL~>kAWIFN9b(QB{ z_U1gzs1p6D6pzFbWKU0X_kEeZ z()_t+bAbqkmL7_LcyT+A(<9XC+ga; z{`x9e#ksWY-pti2%`EW-aGb8^H5PKY;MJqV4<6?G8ig_h?Mj-*DJ?x1gOS-m3`Q_C zcT+4>l4XVb!fsiZrq}6+EXkv0Z8<;A%i;LH>kzH0(5FJx1nHjsL}lJ&A+d0r-6jh*D5t0iO1hc-Wp$n;P(97W&MO))C! zl6*dJT5jIvSa>TFs5Ud>*)Hle8b+frY`zd#Ba^s-5ezyl3BC4iN&e0$@&-mR{my!h zFD*!4tGV3F5?=`0XZ0LfkQ}~qPN@obnG#XMXGCCDZSBwedQ8-o7dnS7$ZNW zB1&>N=CU&UAS$^eP;*>#<+$kb2FM(oV3jY(QeOa@$w)ZY&6vwZKmgZUur+jIFV3ZH z<`sKDsCPubf&ow=p-yRmvOLDip5c?mF0y}hiR$aE6xFrkEY3mwQZ*+so%H=Cdb-2P zsKd(1P?Vbf5mxzvtZ470uun(KV#N2+d7K6|H@`i{*D?!0YwAM`2#2xW$rUs25P zo+tU#peLxLP&)tkIkRRNKhAb>Hkl%MqK2$c1Z`Hv z-M3AZGziM#B0wb}rcP?6$&ojR;fKHEsb~z7D)<8-(UD5=7mZzPYw4kUSs~3kHgGw^ zHoq%(3l>5e;zhaC_Ky?n9cDWMf6ox5fBQB?MY(irtLAdC2d|nw2VGnW2-3$_sq}wT zNcqC(|M7ix`$M>d;A@8t^OLEsKDmDnn^FpY-q^*~mLAG0N~qtlfva}&gTIF33!^`I zk&OsOwK`TNqHI(ZzSY^!#{WG)X>kr6p(vI`M}QC{R5g8E6^x+$r}x<94d51nKRS4r zAI|*lp`)Auw(Z};rc{d8>e~5ILnoCLCDiZO$W^=P!2$8!Db~m0SX7m-zxpO4z`MY^ z`}gsfqVlcIL7o9*A#OikxUUod2!+reImy;>KiQ~!>);W-H`i~bfOz7-UY<-T9I9*Q zk;X16R}@pfa|2hci;RexCJI{nSPs1V-J`sH+p`bzIk4wHKgSYT=8shf&v8aFKij{L zKS$-ixE&0RdC3*I*>6S|+(({Z|<*QaL@gX2`!)ZbE`x-S6YQWN=Sud@-A zUmQBhckX8o3kG1@YFblJ->Pt^q2a-dvS!XA6qVJ3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + W + + diff --git a/WorkFeature/__init__.py b/WorkFeature/__init__.py index 3d4b3ba..07b2b88 100644 --- a/WorkFeature/__init__.py +++ b/WorkFeature/__init__.py @@ -10,7 +10,7 @@ * galou_breizh for macro which creates a circle from 3 selected points * * Eriossoltero for macro Ellipse-Center+2Points * * Many Thanks to wmayer for his active help on testing and debbuging * -* Special thanks to Mario52 for FCCamera code * +* Special thanks to Mario52 for FCCamera code, cutCircle... * * for bounding box codes, advices, diverse pieces of codes * * and all discussions...merci Mario * *************************************************************************** @@ -51,7 +51,7 @@ if not sys.path.__contains__("/usr/lib/freecad/lib"): import WFGui_2015 as WFGui global myRelease -myRelease = "2105_02_28" +myRelease = "2105_03_08" import os.path import math @@ -87,9 +87,12 @@ global centerOfMass centerOfMass=True global verbose verbose=0 +global tolerance +tolerance=1e-10 m_numberLinePart = 2 m_numberLineCut = 2 +m_numberCircleCut = 2 m_distanceLinePoint = 0.0 m_extensionTwoPointsAxis = 0.0 m_extensionLinePointAxis = 0.0 @@ -115,7 +118,7 @@ m_clickForPoint = True m_clickForAxis = True m_stack = [] -error_msg = "Not yet Developped !" +error_msg_not_yet = "Not yet Developped !" #################################################################################### @@ -677,7 +680,7 @@ def distanceBetween(A, B): return edge.Length -def colinearVectors(A, B, C, info=0, precision=1e-12): +def colinearVectors(A, B, C, info=0, tolerance=1e-12): """ Return true if the 3 points are aligned. """ Vector_1 = B - A @@ -689,7 +692,7 @@ def colinearVectors(A, B, C, info=0, precision=1e-12): if info != 0: print_point(Vector_3, msg="Vector_1.cross(Vector_2) : ") - if abs(Vector_3.x) <= precision and abs(Vector_3.y) <= precision and abs(Vector_3.z) <= precision: + if abs(Vector_3.x) <= tolerance and abs(Vector_3.y) <= tolerance and abs(Vector_3.z) <= tolerance: if info != 0: print_msg("Colinear Vectors !") return True @@ -1221,7 +1224,7 @@ def plot_axis(Vector_A, Vector_B, part, name, grp="WorkAxis"): return axis_User_Name, axis -def plot_circle(Radius, Position, Direction, part= "Part::Feature", name= "Circle", grp="Circles"): +def plot_circle(Radius, Position, Direction, part= "Part::Feature", name= "Circle", grp="WorkCircles"): if not(App.ActiveDocument.getObject( grp )): App.ActiveDocument.addObject("App::DocumentObjectGroup", grp) circle = App.ActiveDocument.addObject(part, name) @@ -1230,8 +1233,39 @@ def plot_circle(Radius, Position, Direction, part= "Part::Feature", name= "Circl circle_User_Name = circle.Label Gui.ActiveDocument.getObject(circle_User_Name).LineColor = (1.00,0.67,0.00) return circle_User_Name, circle - + +def plot_arc(center, normal, radius, startangle, endangle, part= "Part::Feature", name= "Circle", grp="WorkCircles"): + if not(App.ActiveDocument.getObject( grp )): + App.ActiveDocument.addObject("App::DocumentObjectGroup", grp) + arc = App.ActiveDocument.addObject(part, name) + c = Part.Circle(center, normal, radius) + start = math.radians(startangle) + end = math.radians(endangle) + Arc = Part.Arc(c,start,end) + arc.Shape = Arc.toShape() + App.ActiveDocument.getObject( grp ).addObject(arc) + arc_User_Name = arc.Label + Gui.ActiveDocument.getObject(arc_User_Name).LineColor = (1.00,0.67,0.00) + return arc_User_Name, arc + + +def plot_arc2(Radius, Placem, Face, Startangle, Endangle, Support, part= "Part::Feature", name= "Circle", grp="WorkCircles"): + if not(App.ActiveDocument.getObject( grp )): + App.ActiveDocument.addObject("App::DocumentObjectGroup", grp) + arc = App.ActiveDocument.addObject(part, name) + print_msg(str(Placem)) + #arc.Shape = Part.makeCircle(Radius, Position, Direction) + toto = Draft.makeCircle(radius=Radius,placement=Placem,face=Face,startangle=Startangle,endangle=Endangle,support=Support) + print_msg(str(toto)) + return + #arc.Shape = + App.ActiveDocument.getObject( grp ).addObject(arc) + arc_User_Name = arc.Label + Gui.ActiveDocument.getObject(arc_User_Name).LineColor = (1.00,0.67,0.00) + return arc_User_Name, arc + + def plot_ellipse(S1, S2, Center, part= "Part::Feature", name= "Ellipse", grp="Circles"): """Creates an ellipse centered on the point Center, where the plane of the ellipse is defined by Center, S1 and S2, @@ -1452,6 +1486,8 @@ def bounding_box(grp,ori_X,ori_Y,ori_Z,length_X,length_Y,length_Z,info=0): def plot_originObject(): + global verbose + msg=verbose m_actDoc = get_ActiveDocument(info=msg) if m_actDoc == None: return None @@ -1570,6 +1606,7 @@ def plot_originObject(): except: printError_msg("Could not Create Origin objects !") + def bBox_toggled(flag): """ Respond to the change of bounding box flag. """ @@ -1577,7 +1614,23 @@ def bBox_toggled(flag): centerOfMass = True if flag == True: centerOfMass = False - + + +def setTolerance(value): + """ Respond to the change in tolerance value from the text box. + """ + try: + # First we check if a valid number have been entered + global tolerance + if str(value) == '-': + return + tolerance = float(value) + print_msg("New tolerance is :" + str(tolerance)) + #plot_alongLinePoint() + except ValueError: + printError_msg("Tolerance must be valid number !") + + def plot_centerObjectPoint(): """ Create a Point at center location of all selected Object(s). if flag centerOfMass=True @@ -1708,9 +1761,10 @@ def plot_extremaLinePoint(): if Number_of_Edges >= 1: Edge_List = SelectedObjects[4] for i in range( Number_of_Edges ): - if msg != 0: - print_msg(str(Edge_List[i])) edge = Edge_List[i] + if msg != 0: + print_msg(str(edge)) + Vector_A = edge.Vertexes[0].Point Vector_B = edge.Vertexes[-1].Point if msg != 0: @@ -1776,10 +1830,11 @@ def plot_centerLinePoint(): if Number_of_Edges >= 1: Edge_List = SelectedObjects[4] for i in range( Number_of_Edges ): + edge = Edge_List[i] if m_numberLinePart == 2: if msg != 0: - print_msg(str(Edge_List[i])) - Vector_Line_Center = centerLinePoint(Edge_List[i],info=msg) + print_msg(str(edge)) + Vector_Line_Center = centerLinePoint(edge,info=msg) if msg != 0: print_point(Vector_Line_Center, msg="MidPoint : ") @@ -1787,7 +1842,7 @@ def plot_centerLinePoint(): print_point(Vector_Line_Center,str(Center_User_Name) + result_msg + " at :") else: for j in range( 1, m_numberLinePart ): - Vector_Line_Center = centerLinePoints(Edge_List[i], j , m_numberLinePart, info=msg) + Vector_Line_Center = centerLinePoints(edge, j , m_numberLinePart, info=msg) Center_User_Name = plot_point(Vector_Line_Center, part, name) print_point(Vector_Line_Center,str(Center_User_Name) + result_msg + " at :") else: @@ -2652,17 +2707,20 @@ def plot_cutAxis(): if (Number_of_Edges >= 1): Edge_List = SelectedObjects[4] for i in range( Number_of_Edges ): + edge = Edge_List[i] if msg != 0: - print_msg(str(Edge_List[i])) - Vector_A = Edge_List[i].valueAt( 0.0 ) + print_msg(str(edge)) + #Vector_A = edge.valueAt( 0.0 ) + Vector_A = edge.Vertexes[0].Point for j in range( 1, m_numberLineCut ): - Vector_B = centerLinePoints(Edge_List[i], j , m_numberLineCut, info=msg) + Vector_B = centerLinePoints(edge, j , m_numberLineCut, info=msg) if msg != 0: print_point(Vector_A,"Vector_A is : ") print_point(Vector_B,"Vector_B is : ") Axis_User_Name, axis = plot_axis(Vector_A, Vector_B, part, name) Vector_A = Vector_B - Vector_B = Edge_List[i].valueAt( Edge_List[i].Length ) + #Vector_B = edge.valueAt( edge.Length ) + Vector_B = edge.Vertexes[-1].Point if msg != 0: print_point(Vector_A,"Vector_A is : ") print_point(Vector_B,"Vector_B is : ") @@ -2689,7 +2747,6 @@ def extensionLinePointAxis(value): printError_msg("Extension must be valid number !") - def plot_linePointAxis(): """ Plot an Axis Perpendicular to an Axis and crossing a Point @@ -2701,7 +2758,7 @@ def plot_linePointAxis(): "Select one Point and one Line only !\n" + \ "The Point is NOT on the Line!" result_msg = " : Perpendicular Axis created !" - name = "Perpendicular Line" + name = "Perpendicular_Line" part = "Part::Feature" Selection = get_SelectedObjects(info=msg, printError=False) try: @@ -2743,6 +2800,164 @@ def plot_linePointAxis(): printError_msg(error_msg) except: printError_msg(error_msg) + + +def plot_planeLinePointAxis(): + """ + Plot an Axis Perpendicular to an Axis, crossing a Point and Parallel to a Plane. + -Select one Plane, one Axis and one Point ON the previous Axis. + """ + global verbose + msg=verbose + m_actDoc = get_ActiveDocument(info=msg) + if m_actDoc == None: + return None + createFolders('WorkAxis') + error_msg = "Unable to create Perpendicular Axis : \nSelect one Plane, one Axis and one Point ON the previous Axis !" + result_msg = " : Perpendicular Axis created !" + name = "Perpendicular_Line_on_plane" + part = "Part::Feature" + Selection = get_SelectedObjects(info=msg, printError=False) + m_num, m_selEx, m_objs, m_objNames = get_InfoObjects(info=0) + m_xmax, m_xmin, m_ymax, m_ymin, m_zmax, m_zmin = minMaxObjectsLimits(m_objs,info=0) + try: + SelectedObjects = Selection + Number_of_Points = SelectedObjects[0] + Number_of_Edges = SelectedObjects[1] + Number_of_Planes = SelectedObjects[2] + if msg != 0: + print_msg("Number_of_Points=" + str(Number_of_Points) + \ + "\nNumber_of_Edges=" + str(Number_of_Edges) + \ + "\nNumber_of_Planes=" + str(Number_of_Planes)) + if (Number_of_Points == 1 ) and (Number_of_Edges == 1) and (Number_of_Planes) == 1 : + Point_List = SelectedObjects[3] + Edge_List = SelectedObjects[4] + Plane_List = SelectedObjects[5] + # Create a Perpendicular plane to selected line and crossing the point + Vector_A = Edge_List[0].Vertexes[0].Point + Vector_B = Edge_List[0].Vertexes[-1].Point + Vector_C = Point_List[0].Point + if msg != 0: + print_point(Vector_A, msg="Vector_A : ") + print_point(Vector_B, msg="Vector_B : ") + print_point(Vector_C, msg="Vector_C : ") + # Intersection point T on a Line given one Line and One Point C. + if colinearVectors(Vector_A, Vector_B, Vector_C, info=msg, tolerance=1e-10): + Vector_T = Vector_C + Distance = Vector_B.sub(Vector_A).Length + else: + Vector_T, Distance, Vector_Tprime = intersecPerpendicularLine(Vector_A, Vector_B, Vector_C, info=msg) + if msg != 0: + print_point(Vector_T, msg="Intersection point T : ") + Plane_Normal = Vector_B.sub(Vector_A) + Plane_Point = Vector_T + (Vector_C - Vector_T).multiply(0.5) + #Edge_Length = Distance * 1.5 + + #Plane_User_Name, plane = plot_plane(Edge_Length, Edge_Length, Plane_Point, Plane_Normal, part, name) + #print_msg(str(Plane_User_Name) + result_msg ) + + # Then intersection of the 2 planes + Selected_Plane1 = Plane_List[0] + Selected_Plane2 = plane.Shape + Plane_Normal1 = Selected_Plane1.normalAt(0,0) + Plane_Normal2 = Plane_Normal + if msg != 0: + print_point(Plane_Normal1, msg="Normal1 : ") + print_point(Plane_Normal2, msg="Normal2 : ") + Plane_Point1 = Selected_Plane1.CenterOfMass + Plane_Point2 = Plane_Point + if msg != 0: + print_point(Plane_Point1 , msg="Plane_Point1 : ") + print_point(Plane_Point2 , msg="Plane_Point2 : ") + + Axis_dir = intersecPlanePlane(Plane_Normal1, Plane_Point1, Plane_Normal2, Plane_Point2, info=msg) + if msg != 0: + print_point(Axis_dir , msg="Axis_dir : ") + + # Intersection Line found + if Axis_dir != None: + if msg != 0: + print_msg("Selected_Plane1=" + str(Selected_Plane1)) + print_msg("Selected_Plane1.Edges=" + str(Selected_Plane1.Edges)) + Number_of_Edges = len(Selected_Plane1.Edges) + if msg != 0: + print_msg("Number_of_Edges=" + str(Number_of_Edges)) + Vertx = [] + Vertx.append(App.Vector(0.0, 0.0, 0.0)) + Vertx.append(App.Vector(0.0, 0.0, 0.0)) + + min_val, max_val = init_min_max() + dist_to_center_min = max_val + # For the first plane look after all edges and look at + # intersections of the edges with the second plane + for j in range(Number_of_Edges): + A = Selected_Plane1.Edges[j].Vertexes[0].Point + B = Selected_Plane1.Edges[j].Vertexes[-1].Point + if msg != 0: + print_point(A , msg="A : ") + print_point(B , msg="B : ") + T = intersecLinePlane(A, B, Plane_Normal2, Plane_Point2, info=0) + if T != None: + if msg != 0: + print_point(T , msg="T : ") + D = T - Plane_Point1 + dist_to_center = math.sqrt(D.dot(D)) + if msg != 0: + print_msg("D=" + str(D)) + print_msg("dist_to_center=" + str(dist_to_center)) + if dist_to_center < dist_to_center_min: + dist_to_center_min = dist_to_center + Vertx[0] = T + + if msg != 0: + print_msg("Selected_Plane2=" + str(Selected_Plane2)) + print_msg("Selected_Plane2.Edges=" + str(Selected_Plane2.Edges)) + + Number_of_Edges = len(Selected_Plane2.Edges) + if msg != 0: + print_msg("Number_of_Edges=" + str(Number_of_Edges)) + + dist_to_center_min = max_val + for j in range(Number_of_Edges): + A = Selected_Plane2.Edges[j].valueAt( 0.0 ) + B = Selected_Plane2.Edges[j].valueAt(Selected_Plane2.Edges[j].Length ) + if msg != 0: + print_point(A , msg="A : ") + print_point(B , msg="B : ") + T = intersecLinePlane(A, B, Plane_Normal1, Plane_Point1, info=0) + if T != None: + if msg != 0: + print_point(T , msg="T : ") + D = T - Plane_Point2 + dist_to_center = math.sqrt(D.dot(D)) + if msg != 0: + print_msg("D=" + str(D)) + print_msg("dist_to_center=" + str(dist_to_center)) + if dist_to_center < dist_to_center_min: + dist_to_center_min = dist_to_center + Vertx[1] = T + + C = meanVectorsPoint(Vertx,info=1) + + if C != None: + extension = m_xmax - m_xmin + if extension < m_ymax - m_ymin: + extension = m_ymax - m_ymin + if extension < m_zmax - m_zmin: + extension = m_zmax - m_zmin + extension = extension/2 + A = C - Axis_dir.normalize().multiply(extension*1.3) + B = C + Axis_dir + Axis_User_Name, axis = plot_axis(A, B, part, name) + print_msg(str(Axis_User_Name) + result_msg ) + else: + printError_msg(error_msg) + else: + printError_msg(error_msg) + else: + printError_msg(error_msg) + except: + printError_msg(error_msg) def plot_pointLineAxis(): @@ -3099,25 +3314,30 @@ def line_toSketch(): # Get Point(s) from the selection for m_i in range(1,m_num): m_obj = m_selEx[m_i] - SubObject = m_obj.SubObjects[0] - if SubObject.ShapeType == "Edge": - if msg != 0: - print_msg("Found a Edge object!") - m_Vertex1 = SubObject.Vertexes[0] - m_Vertex2 = SubObject.Vertexes[1] - # Get the Point - m_p1 = m_Vertex1.Point - m_p2 = m_Vertex2.Point - # Projection of the Point selected onto the Sketch Plane - Projection1 = m_p1.projectToPlane(m_sketch.Placement.Base, m_recN) - Projection2 = m_p2.projectToPlane(m_sketch.Placement.Base, m_recN) - # Append the Projection - geoList.append(Part.Line(Projection1,Projection2)) - # Add the geometry list to the Sketch - m_sketch.addGeometry(geoList) - m_num_line = m_num_line + 1 - else: - continue + #SubObject = m_obj.SubObjects[0] + for SubObject in m_obj.SubObjects: + if SubObject.ShapeType == "Edge": + if msg != 0: + print_msg("Found a Edge object!") + if len(SubObject.Vertexes) ==2: + m_Vertex1 = SubObject.Vertexes[0] + m_Vertex2 = SubObject.Vertexes[1] + else: + printError_msg(error_msg) + return + # Get the Point + m_p1 = m_Vertex1.Point + m_p2 = m_Vertex2.Point + # Projection of the Point selected onto the Sketch Plane + Projection1 = m_p1.projectToPlane(m_sketch.Placement.Base, m_recN) + Projection2 = m_p2.projectToPlane(m_sketch.Placement.Base, m_recN) + # Append the Projection + geoList.append(Part.Line(Projection1,Projection2)) + # Add the geometry list to the Sketch + m_sketch.addGeometry(geoList) + m_num_line = m_num_line + 1 + else: + continue # Refresh App.getDocument(str(m_actDoc.Name)).recompute() print_msg(str(m_num_line) + result_msg ) @@ -3277,7 +3497,166 @@ def plot_3pointsCircle(): except: printError_msg(error_msg) + +def numberCircleCut(value): + """ Respond to the change in number of cut value from the spin box. + """ + global verbose + msg=verbose + + try: + # First we check if a valid number have been entered + global m_numberCircleCut + if str(value) == '-': + return + m_numberCircleCut = int(value) + if msg != 0: + print_msg("New number is :" + str(m_numberCircleCut)) + except ValueError: + printError_msg("Number must be valid !") + + +def plot_cutCircle(): + """Create Arcs: + Cut the selected Circle in 2(n) parts and create 2(n) Arcs. + The number indicates in how many parts to cut. + Original code from Mario52, 24/02/2015 + """ + global verbose + msg=verbose + + m_actDoc = get_ActiveDocument(info=msg) + if m_actDoc == None: + return None + + createFolders('WorkCircles') + error_msg = "Unable to cut the Circle : \nSelect at least one Circle !" + result_msg = " : is last arc created from Circle cut !" + name = "Arc_from_circle" + part = "Part::Feature" + + global m_numberCircleCut + if not (m_numberCircleCut >= 2 and m_numberCircleCut <= 10) : + m_numberCircleCut = 2 + if msg != 0: + print_msg("Number of cuts=" + str(m_numberCircleCut)) + + selection = Gui.Selection.getSelection() + if msg != 0: + print_msg("Number of selected objects=" + str(len(selection))) + for piece in selection: + if msg != 0: + print_msg("Processing object=" + str(piece)) + + if hasattr(piece, 'Name') and hasattr(piece, 'Placement'): + label = str(piece.Name) + circonference = 0.0 + if (label[:6] == "Circle"): + if msg != 0: + print_msg("Object is Circle") + + if hasattr(piece.Shape, 'Length'): + circonference = piece.Shape.Length + if circonference == 0.0 : + printError_msg("Null circonference for this object !") + continue + + # Part::Part2DObject + if (label[:6] == "Circle") and hasattr(piece, 'Radius'): + radius = piece.Radius + if len(piece.Shape.Edges) ==1: + edge = piece.Shape.Edges[0] + center = edge.Curve.Center + normal = edge.Curve.Axis + else: + printError_msg("No edge for this object !") + continue + # Part::PartFeature + elif (label[:6] == "Circle") and hasattr(piece.Shape, 'Curve') and hasattr(piece.Shape.Curve, 'Radius'): + radius = piece.Shape.Curve.Radius + center = piece.Shape.Curve.Center + normal = piece.Shape.Curve.Axis + else: + printError_msg("No radius for this object !") + continue + + pivot1 = 0.0 + pivot0 = float(360/m_numberCircleCut) + if msg != 0: + print_msg("Circonference =" +str(circonference)) + print_msg("Radius =" +str(radius)) + print_msg("Center =" +str(center)) + print_msg("Normal =" +str(normal)) + + for i in range(m_numberCircleCut): + pivot2 = pivot1 + pivot0 + if msg != 0: + print_msg("Start at =" +str(pivot1)) + print_msg("End at =" +str(pivot2)) + Arc_User_Name, arc = plot_arc(center, normal, radius, pivot1, pivot2, part, name) + pivot1 += pivot0 + + print_msg(str(Arc_User_Name) + result_msg ) + + elif (label[:8] == "Cylinder"): + if msg != 0: + print_msg("Object is Cylinder") + + pivot0 = float(piece.Angle/m_numberCircleCut) + printError_msg(error_msg_not_yet) + + elif label[:3] == "Arc": + if msg != 0: + print_msg("Object is Arc") + + if hasattr(piece.Shape, 'Length'): + circonference = piece.Shape.Length + if circonference == 0.0 : + printError_msg("Null circonference for this object !") + continue + + # Part::Part2DObject + if (label[:3] == "Arc") and hasattr(piece, 'Radius'): + radius = piece.Radius + if len(piece.Shape.Edges) ==1: + edge = piece.Shape.Edges[0] + center = edge.Curve.Center + normal = edge.Curve.Axis + else: + printError_msg("No edge for this object !") + continue + First = float(piece.FirstAngle) + Last = float(piece.LastAngle) + # Part::PartFeature + elif (label[:3] == "Arc") and hasattr(piece.Shape, 'Curve') and hasattr(piece.Shape.Curve, 'Radius'): + radius = piece.Shape.Curve.Radius + center = piece.Shape.Curve.Center + normal = piece.Shape.Curve.Axis + First = float(piece.Shape.FirstParameter) + Last = float(piece.Shape.LastParameter) + First = math.degrees(First) + Last = math.degrees(Last) + else: + printError_msg("No radius for this object !") + continue + + pivot0 = abs((First - Last) / m_numberCircleCut) + pivot1 = First + for i in range(m_numberCircleCut): + pivot2 = pivot1 + pivot0 + if msg != 0: + print_msg("Start at =" +str(pivot1)) + print_msg("End at =" +str(pivot2)) + Arc_User_Name, arc = plot_arc(center, normal, radius, pivot1, pivot2, part, name) + pivot1 += pivot0 + + print_msg(str(Arc_User_Name) + result_msg ) + Gui.ActiveDocument.getObject(label).Visibility=False + else: + printError_msg(error_msg) + + def plot_3pointsEllipse(): """Select a center and 2 Points to create an Ellipse. """ @@ -3373,7 +3752,8 @@ def plot_3PointsPlane(): def plot_axisPointPlane(): """ Create a plane passing trougth a Line and a Point. """ - msg=0 + global verbose + msg=verbose createFolders('WorkPlanes') error_msg = "Unable to create Plane : \nSelect one Line and one Point only !" result_msg = " : Plane created !" @@ -3384,26 +3764,30 @@ def plot_axisPointPlane(): SelectedObjects = Selection Number_of_Points = SelectedObjects[0] Number_of_Edges = SelectedObjects[1] - #print_msg("Number_of_Points=" + str(Number_of_Points) + " Number_of_Edges=" + str(Number_of_Edges)) + if msg !=0: + print_msg("Number_of_Points=" + str(Number_of_Points) + \ + "\nNumber_of_Edges=" + str(Number_of_Edges)) points = [] if (Number_of_Points == 1) and (Number_of_Edges == 1): Points_List = SelectedObjects[3] Edge_List = SelectedObjects[4] - #print_msg(str(Points_List)) - #print_msg(str(Edge_List)) + if msg !=0: + print_msg(str(Points_List)) + print_msg(str(Edge_List)) Point_C = Points_List[0].Point points.append(Point_C) Point_A = Edge_List[0].valueAt(0.0) points.append(Point_A) Point_B = Edge_List[0].valueAt(Edge_List[0].Length) points.append(Point_B) - #print_point(Point_A, msg="Point_A : ") - #print_point(Point_B, msg="Point_B : ") - #print_point(Point_C, msg="Point_C : ") + if msg !=0: + print_point(Point_A, msg="Point_A : ") + print_point(Point_B, msg="Point_B : ") + print_point(Point_C, msg="Point_C : ") #Vector_Center = centerBBVectorsPoint(points, info=0) - Vector_Center = meanVectorsPoint(points,info=0) - xmax, xmin, ymax, ymin, zmax, zmin = minMaxVectorsLimits(points,info=0) + Vector_Center = meanVectorsPoint(points,info=msg) + xmax, xmin, ymax, ymin, zmax, zmin = minMaxVectorsLimits(points,info=msg) #print_point(Vector_Center, msg="Center of A, B and C : ") length = xmax - xmin @@ -3689,7 +4073,7 @@ def plot_centerObjectPlanes(): """ msg=0 createFolders('WorkPlanes') - error_msg = "Unable to create Planes : \nSelect at least one objec !" + error_msg = "Unable to create Planes : \nSelect at least one object !" result_msg = " : Planes created !" m_actDoc = get_ActiveDocument(info=msg) @@ -4742,7 +5126,7 @@ def plot_cutObject(): if msg == 1: Axis_User_Name, Axis = plot_axis(BB_Edges[m_i][2][0], BB_Edges[m_i][2][1], part, "bb_edge", grp=str(m_dir)) BB_edges_names.append(str(Axis_User_Name)) - if colinearVectors(BB_Edges[m_i][2][0], Point_A2, BB_Edges[m_i][2][1], info=0, precision=1e-10): + if colinearVectors(BB_Edges[m_i][2][0], Point_A2, BB_Edges[m_i][2][1], info=0, tolerance=1e-10): # Plot them if msg == 1: Point_A2_prime_User_Name = plot_point(BB_Edges[m_i][2][0], part, "Point_A2_prime", grp=str(m_dir)) @@ -4759,7 +5143,7 @@ def plot_cutObject(): if msg == 1: Axis_User_Name, Axis = plot_axis(BB_Edges[m_i][2][0], BB_Edges[m_i][2][1], part, "bb_edge", grp=str(m_dir)) BB_edges_names.append(str(Axis_User_Name)) - if colinearVectors(BB_Edges[m_i][2][0], Point_B2, BB_Edges[m_i][2][1], info=0, precision=1e-10): + if colinearVectors(BB_Edges[m_i][2][0], Point_B2, BB_Edges[m_i][2][1], info=0, tolerance=1e-10): # Plot them if msg == 1: Point_A2_prime_User_Name = plot_point(BB_Edges[m_i][2][0], part, "Point_B2_prime", grp=str(m_dir)) @@ -4939,57 +5323,137 @@ def plot_cutObject(): cut_reset() -def object_parallel(): - """ +def two_objects_are(case): """ # Javier Martinez Garcia 2015 - SelObj = Gui.Selection.getSelectionEx() - try: - NormalA = SelObj[0].SubObjects[0].normalAt(0,0) - NormalB = SelObj[1].SubObjects[0].normalAt(0,0) - if NormalA.cross(NormalB).Length == 0.0: - print_gui_msg("\nFaces are parallel\n") - else: - print_gui_msg("\nNon parallel faces\n") + # Adapted by Rentlau_64 2015 + """ + global verbose + msg=verbose + global tolerance + + if case == "parallel": + error_msg = "Unable to check paralelism : \nSelect 2 objects \n(either 2 Planes or 2 Edges) !" + elif case == "perpendicular": + error_msg = "Unable to check perpendicularity : \nSelect 2 objects \n(either 2 Planes or 2 Edges) !" + elif case == "coplanar": + error_msg = "Unable to check coplanarity : \nSelect 2 objects \n(either 2 Planes or 2 Edges) !" + try: + SelObj = Gui.Selection.getSelectionEx() + + if len(SelObj) == 1: + if SelObj[0].HasSubObjects: + if len(SelObj[0].SubObjects) == 2: + sub01 = SelObj[0].SubObjects[0] + sub02 = SelObj[0].SubObjects[1] + else: + printError_msg(error_msg) + else: + printError_msg(error_msg) + return + elif len(SelObj) == 2: + if SelObj[0].HasSubObjects: + sub01 = SelObj[0].SubObjects[0] + sub02 = SelObj[1].SubObjects[0] + else: + printError_msg(error_msg) + else: + printError_msg(error_msg) + return + + if sub01.ShapeType != sub02.ShapeType: + printError_msg(error_msg) + return + + if msg: + print_msg("Tolerance = " + str(tolerance)) + m_tol_msg = "\n(for tolerance of " + str(tolerance) +")" + if sub01.ShapeType == 'Edge' : + if msg: + print_msg("Comparing two Edges") + EdgeA = sub01 + EdgeB = sub02 + VA = (EdgeA.Curve.EndPoint - EdgeA.Curve.StartPoint).normalize() + VB = (EdgeB.Curve.EndPoint - EdgeB.Curve.StartPoint).normalize() + #parallel + if case == "parallel": + #if (VA.cross(VB)).Length == 0.0: + if abs((VA.cross(VB)).Length) <= tolerance: + print_gui_msg("Edges are parallel" + m_tol_msg ) + else: + print_gui_msg("Non parallel edges" + m_tol_msg ) + #perpendicular + elif case == "perpendicular": + #if VA.dot(VB) == 0.0: + if abs(VA.dot(VB)) <= tolerance: + print_gui_msg("Edges are perpendicular" + m_tol_msg ) + else: + print_gui_msg("Non perpendicular edges" + m_tol_msg ) + #coplanar + elif case == "coplanar": + VC = EdgeB.Curve.StartPoint - EdgeA.Curve.StartPoint + VD = EdgeB.Curve.EndPoint - EdgeA.Curve.EndPoint + #if ((VA.cross(VB)).cross((VC.cross(VD)))).Length == 0.0: + if abs(((VA.cross(VB)).cross((VC.cross(VD)))).Length) <= tolerance: + print_gui_msg("Edges are coplanar" + m_tol_msg ) + else: + print_gui_msg("Non coplanar edges" + m_tol_msg ) + + + if sub01.ShapeType == 'Face' : + if msg: + print_msg("Comparing two Faces") + NormalA = sub01.normalAt(0,0) + NormalB = sub02.normalAt(0,0) + #parallel + if case == "parallel": + #if NormalA.cross(NormalB).Length == 0.0: + if msg: + print_msg("abs(NormalA.cross(NormalB).Length) = " + str(abs(NormalA.cross(NormalB).Length))) + + if abs(NormalA.cross(NormalB).Length) <= tolerance: + print_gui_msg("Faces are parallel" + m_tol_msg ) + else: + print_gui_msg("Non parallel faces" + m_tol_msg ) + #perpendicular + elif case == "perpendicular": + #if NormalA.dot(NormalB) == 0.0: + if msg: + print_msg("abs(NormalA.dot(NormalB)) = " + str(abs(NormalA.dot(NormalB)))) + + if abs(NormalA.dot(NormalB)) <= tolerance: + print_gui_msg("Faces are perpendicular" + m_tol_msg ) + else: + print_gui_msg("Non perpendicular faces" + m_tol_msg ) + #coplanar + elif case == "coplanar": + NormalA = sub01.normalAt(0,0) + VAB = (sub02.CenterOfMass-sub01.CenterOfMass).normalize() + if msg: + print_msg("abs(NormalA.dot(VAB)) = " + str(abs(NormalA.dot(VAB)))) + print_msg("abs(NormalB.dot(VAB)) = " + str(abs(NormalB.dot(VAB)))) + #if NormalA.dot(VAB) == 0.0: + if abs(NormalA.dot(VAB)) <= tolerance and abs(NormalB.dot(VAB)) <= tolerance: + print_gui_msg("Coplanar faces" + m_tol_msg ) + else: + print_gui_msg("Non coplanar faces" + m_tol_msg ) + except: - printError_msg("\nWrong selection!\n") + printError_msg(error_msg) + + +def object_parallel(): + two_objects_are("parallel") def object_perpendicular(): - """ - """ - # Javier Martinez Garcia 2015 - SelObj = Gui.Selection.getSelectionEx() - try: - NormalA = SelObj[0].SubObjects[0].normalAt(0,0) - NormalB = SelObj[1].SubObjects[0].normalAt(0,0) - if NormalA.dot(NormalB) == 0.0: - print_gui_msg("\nFaces are perpendicular\n") - else: - print_gui_msg("\nNon perpendicular faces\n") - - except: - printError_msg("\nWrong selection!\n") + two_objects_are("perpendicular") def object_coplanar(): - """ - """ - # Javier Martinez Garcia 2015 - SelObj = Gui.Selection.getSelectionEx() - try: - NormalA = SelObj[0].SubObjects[0].normalAt(0,0) - VAB = (SelObj[1].SubObjects[0].CenterOfMass-SelObj[0].SubObjects[0].CenterOfMass).normalize() - if NormalA.dot(VAB) == 0.0: - print_gui_msg("\nCoplanar faces\n") + two_objects_are("coplanar") - else: - print_gui_msg("\nNon coplanar faces\n") - - except: - printError_msg("\nWrong selection!\n") - ####################################################################################