Removed surfaces module (simply broken and outdated)

This commit is contained in:
Jose Luis Cercos Pita 2012-11-18 12:26:21 +01:00
parent f61f7094ed
commit b1a3621460
44 changed files with 1 additions and 8043 deletions

View File

@ -1071,7 +1071,6 @@ src/Mod/TemplatePyMod/Makefile
src/Mod/Sandbox/Makefile
src/Mod/Sandbox/App/Makefile
src/Mod/Sandbox/Gui/Makefile
src/Mod/Surfaces/Makefile
src/Mod/Ship/Makefile
src/Mod/OpenSCAD/Makefile
src/Mod/Plot/Makefile

View File

@ -44,7 +44,6 @@ if(FREECAD_BUILD_SANDBOX)
add_subdirectory(Sandbox)
endif(FREECAD_BUILD_SANDBOX)
add_subdirectory(Surfaces)
add_subdirectory(Ship)
add_subdirectory(OpenSCAD)

View File

@ -10,7 +10,7 @@ SUBDIRS += Mesh
#endif
if HAVE_OPENCASCADE
SUBDIRS += Part Import PartDesign Raytracing Drawing Arch Surfaces Ship OpenSCAD
SUBDIRS += Part Import PartDesign Raytracing Drawing Arch Ship OpenSCAD
endif
if HAVE_EIGEN3

View File

@ -1,116 +0,0 @@
SET(SurfMain_SRCS
InitGui.py
SurfGui.py
)
SOURCE_GROUP("" FILES ${SurfMain_SRCS})
SET(SurfIcons_SRCS
Icons/BorderIco.png
Icons/BorderIco.xpm
Icons/ConvertIco.png
Icons/ConvertTo4SidesIco.xpm
Icons/Ico.xcf
Icons/IsoCurveIco.png
Icons/IsoCurveIco.xpm
Icons/SliceIco.xcf
Icons/BorderIco.xcf
Icons/ConvertIco.xcf
Icons/Ico.png
Icons/Ico.xpm
Icons/IsoCurveIco.xcf
Icons/SliceIco.png
Icons/SliceIco.xpm
)
SOURCE_GROUP("surficons" FILES ${SurfIcons_SRCS})
SET(SurfBorder_SRCS
surfBorder/__init__.py
)
SOURCE_GROUP("surfborder" FILES ${SurfBorder_SRCS})
SET(SurfConvert_SRCS
surfConvert/__init__.py
surfConvert/Preview.py
surfConvert/TaskPanel.py
surfConvert/TaskPanel.ui
)
SOURCE_GROUP("surfconvert" FILES ${SurfConvert_SRCS})
SET(SurfISOCurve_SRCS
surfISOCurve/__init__.py
surfISOCurve/PointTracker.py
surfISOCurve/TaskPanel.py
surfISOCurve/Preview.py
surfISOCurve/TaskPanel.ui
)
SOURCE_GROUP("surfISOcurve" FILES ${SurfISOCurve_SRCS})
SET(SurfSlice_SRCS
surfSlice/__init__.py
surfSlice/PointTracker.py
surfSlice/TaskPanel.py
surfSlice/Preview.py
surfSlice/TaskPanel.ui
)
SOURCE_GROUP("surfslice" FILES ${SurfSlice_SRCS})
SET(SurfUtils_SRCS
surfUtils/__init__.py
surfUtils/Geometry.py
surfUtils/Math.py
surfUtils/Paths.py
surfUtils/Translator.py
)
SOURCE_GROUP("surfutils" FILES ${SurfUtils_SRCS})
SET(all_files ${SurfMain_SRCS} ${SurfIcons_SRCS} ${SurfBorder_SRCS} ${SurfConvert_SRCS} ${SurfISOCurve_SRCS} ${SurfSlice_SRCS} ${SurfUtils_SRCS})
ADD_CUSTOM_TARGET(Surfaces ALL
SOURCES ${all_files}
)
fc_copy_sources(Surfaces "${CMAKE_BINARY_DIR}/Mod/Surfaces" ${all_files})
INSTALL(
FILES
${SurfIcons_SRCS}
DESTINATION
Mod/Surfaces/Icons
)
INSTALL(
FILES
${SurfBorder_SRCS}
DESTINATION
Mod/Surfaces/surfBorder
)
INSTALL(
FILES
${SurfConvert_SRCS}
DESTINATION
Mod/Surfaces/surfConvert
)
INSTALL(
FILES
${SurfISOCurve_SRCS}
DESTINATION
Mod/Surfaces/surfISOCurve
)
INSTALL(
FILES
${SurfSlice_SRCS}
DESTINATION
Mod/Surfaces/surfSlice
)
INSTALL(
FILES
${SurfUtils_SRCS}
DESTINATION
Mod/Surfaces/surfUtils
)
INSTALL(
FILES
${SurfMain_SRCS}
DESTINATION
Mod/Surfaces
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

View File

@ -1,749 +0,0 @@
/* XPM */
static char * Ico_xpm[] = {
"128 128 618 2",
" c None",
". c #EDECEB",
"+ c #EFEEEE",
"@ c #ECEDEC",
"# c #EFEFEF",
"$ c #000000",
"% c #EAEAEB",
"& c #EBEBEA",
"* c #E8E8E8",
"= c #E1E1E1",
"- c #DBDBDB",
"; c #D7D6D6",
"> c #E6E5E6",
", c #E9E8E8",
"' c #EEEEED",
") c #ECECEC",
"! c #EBEBEB",
"~ c #E9E9E9",
"{ c #E9E9E8",
"] c #E5E6E6",
"^ c #D7D7D7",
"/ c #B2B2B1",
"( c #A6A6A6",
"_ c #B7B7B7",
": c #D1D0D1",
"< c #ECEBEB",
"[ c #00B5AA",
"} c #00B4A8",
"| c #00B3A8",
"1 c #00B1A8",
"2 c #00B0A6",
"3 c #00AFA5",
"4 c #00AEA4",
"5 c #00ACA2",
"6 c #00ABA1",
"7 c #00AAA0",
"8 c #EAEBEA",
"9 c #E2E2E2",
"0 c #B6B6B6",
"a c #979898",
"b c #999999",
"c c #BCBCBC",
"d c #D8D9D8",
"e c #EFF0EF",
"f c #00BDB2",
"g c #00BCB1",
"h c #00BBAF",
"i c #00B9AF",
"j c #00B8AE",
"k c #00B7AC",
"l c #00B6AB",
"m c #00B4AA",
"n c #00B1A7",
"o c #00AFA4",
"p c #00ADA3",
"q c #00A99F",
"r c #00A79E",
"s c #00A79C",
"t c #00A59B",
"u c #E3E3E2",
"v c #B0B1B0",
"w c #999898",
"x c #949495",
"y c #00C2B7",
"z c #00C1B6",
"A c #00C0B5",
"B c #00BFB4",
"C c #00BDB3",
"D c #00BDB1",
"E c #00BBB0",
"F c #00BAAF",
"G c #00B9AE",
"H c #00B8AD",
"I c #00B6AC",
"J c #00B4A9",
"K c #00AEA3",
"L c #00A79D",
"M c #00A69B",
"N c #00A49A",
"O c #D7D8D7",
"P c #959696",
"Q c #A0A1A1",
"R c #DFDFE0",
"S c #00C3B8",
"T c #00C4B8",
"U c #00C2B8",
"V c #00C1B7",
"W c #00C0B4",
"X c #00BEB4",
"Y c #00BAAE",
"Z c #00B7AB",
"` c #00B0A5",
" . c #00AEA5",
".. c #00ABA2",
"+. c #00A99E",
"@. c #00A89E",
"#. c #00A69C",
"$. c #00A59A",
"%. c #00A399",
"&. c #00A298",
"*. c #EAEAEA",
"=. c #C6C5C5",
"-. c #9C9B9B",
";. c #9A9A9A",
">. c #959495",
",. c #B5B6B6",
"'. c #E6E6E6",
"). c #00C5B9",
"!. c #00BEB3",
"~. c #00B5A9",
"{. c #00B2A7",
"]. c #00B1A6",
"^. c #00A098",
"/. c #DADBDB",
"(. c #A8A8A8",
"_. c #9B9A9A",
":. c #989898",
"<. c #9E9F9F",
"[. c #D8D8D8",
"}. c #E5E5E5",
"|. c #00C3B7",
"1. c #00C6BA",
"2. c #00C6B9",
"3. c #00C5BA",
"4. c #00C5B8",
"5. c #00BCB2",
"6. c #00BCB0",
"7. c #00B8AC",
"8. c #00B3A9",
"9. c #00ADA2",
"0. c #00A398",
"a. c #00A198",
"b. c #00A097",
"c. c #B6B5B5",
"d. c #989998",
"e. c #9C9D9C",
"f. c #959596",
"g. c #BDBDBD",
"h. c #00C2B6",
"i. c #00C7BB",
"j. c #00C8BB",
"k. c #00C6BB",
"l. c #00C4B9",
"m. c #00BFB3",
"n. c #00B7AD",
"o. c #00ACA1",
"p. c #00A59C",
"q. c #00A49B",
"r. c #009E96",
"s. c #E4E4E4",
"t. c #BABBBA",
"u. c #9C9C9C",
"v. c #9E9E9E",
"w. c #9B9B9C",
"x. c #AAAAAA",
"y. c #DCDCDB",
"z. c #00C1B5",
"A. c #00C8BD",
"B. c #00C9BD",
"C. c #00C9BC",
"D. c #00C8BC",
"E. c #00B2A8",
"F. c #00AFA6",
"G. c #00A197",
"H. c #009F96",
"I. c #E4E5E4",
"J. c #B9B9B8",
"K. c #A0A09F",
"L. c #9D9D9D",
"M. c #9F9F9F",
"N. c #D8D8D9",
"O. c #00C7BA",
"P. c #00CABE",
"Q. c #00CBBF",
"R. c #00CBBE",
"S. c #00C9BE",
"T. c #00C7BC",
"U. c #00BBB1",
"V. c #00BAB0",
"W. c #00AAA1",
"X. c #00A89D",
"Y. c #13A79E",
"Z. c #03A097",
"`. c #009D94",
" + c #9F9FA0",
".+ c #A2A1A1",
"++ c #A0A0A0",
"@+ c #D0D0D0",
"#+ c #00C0B6",
"$+ c #00CCC0",
"%+ c #00CABD",
"&+ c #26ABA4",
"*+ c #10A39C",
"=+ c #009E94",
"-+ c #AEAEAE",
";+ c #A1A1A2",
">+ c #A2A3A2",
",+ c #A0A1A0",
"'+ c #D2D2D3",
")+ c #00CABF",
"!+ c #00CEC1",
"~+ c #00CDC2",
"{+ c #00CDC1",
"]+ c #00CBC0",
"^+ c #00ABA0",
"/+ c #00A9A0",
"(+ c #46B5AF",
"_+ c #63BCB6",
":+ c #009E95",
"<+ c #009C93",
"[+ c #009A92",
"}+ c #D3D3D4",
"|+ c #A8A7A7",
"1+ c #A5A4A4",
"2+ c #A4A5A5",
"3+ c #A2A2A2",
"4+ c #A3A3A2",
"5+ c #D7D7D6",
"6+ c #00CFC2",
"7+ c #00A69D",
"8+ c #0BA59B",
"9+ c #9DCAC7",
"0+ c #2DAAA2",
"a+ c #BABABA",
"b+ c #A7A7A7",
"c+ c #A6A7A6",
"d+ c #A5A6A6",
"e+ c #A3A3A3",
"f+ c #DEDEDE",
"g+ c #00CEC2",
"h+ c #00BEB2",
"i+ c #00ADA4",
"j+ c #00A39A",
"k+ c #06A29A",
"l+ c #9FCBC8",
"m+ c #8FC4C1",
"n+ c #17A39B",
"o+ c #009B92",
"p+ c #009990",
"q+ c #CACACA",
"r+ c #AEAEAD",
"s+ c #A9A9A9",
"t+ c #A8A9A8",
"u+ c #A4A4A4",
"v+ c #B6B5B6",
"w+ c #00CCBF",
"x+ c #47B2AC",
"y+ c #CCD3D4",
"z+ c #9EC8C5",
"A+ c #16A19A",
"B+ c #00988F",
"C+ c #DEDDDD",
"D+ c #AFAEAF",
"E+ c #ABACAC",
"F+ c #ACACAB",
"G+ c #A9A8A8",
"H+ c #A7A6A6",
"I+ c #CDCDCE",
"J+ c #23A9A1",
"K+ c #B5CFCE",
"L+ c #D6D6D6",
"M+ c #BFD0CE",
"N+ c #93C6C3",
"O+ c #3FABA5",
"P+ c #1C1D1D",
"Q+ c #1D1D1D",
"R+ c #292929",
"S+ c #DBDBDA",
"T+ c #DADADA",
"U+ c #C7C6C7",
"V+ c #ADADAD",
"W+ c #AEAEAF",
"X+ c #ACACAC",
"Y+ c #ACABAB",
"Z+ c #ABABAB",
"`+ c #A9AAA9",
" @ c #A5A5A6",
".@ c #D0D0CF",
"+@ c #00B9AD",
"@@ c #00B6AA",
"#@ c #019F95",
"$@ c #56B4AE",
"%@ c #C5D0D0",
"&@ c #D1D2D2",
"*@ c #CDCDCD",
"=@ c #D2D2D2",
"-@ c #D0D2D2",
";@ c #C0C0C0",
">@ c #D3D3D2",
",@ c #CBCCCC",
"'@ c #BEBFBE",
")@ c #B0AFB0",
"!@ c #B1B1B0",
"~@ c #B0B0AF",
"{@ c #ABAAAB",
"]@ c #AAAAAB",
"^@ c #A6A5A5",
"/@ c #B5B5B5",
"(@ c #D0D1D0",
"_@ c #D5D6D5",
":@ c #009F95",
"<@ c #049D95",
"[@ c #73BAB7",
"}@ c #CCD1D1",
"|@ c #C8C8C9",
"1@ c #C2C2C2",
"2@ c #C2C3C3",
"3@ c #C1C1C1",
"4@ c #B8B8B8",
"5@ c #B4B4B4",
"6@ c #B4B4B5",
"7@ c #B3B3B3",
"8@ c #B2B2B2",
"9@ c #B1B1B1",
"0@ c #AFAEAE",
"a@ c #ADAEAE",
"b@ c #ACACAD",
"c@ c #AAA9A9",
"d@ c #BBBCBC",
"e@ c #D1D1D1",
"f@ c #00B0A7",
"g@ c #00A89F",
"h@ c #059C94",
"i@ c #7ABEB9",
"j@ c #BDCCCC",
"k@ c #CBCACB",
"l@ c #C2C1C1",
"m@ c #BBBBBB",
"n@ c #B8B9B8",
"o@ c #B8B9B9",
"p@ c #B4B5B5",
"q@ c #B3B4B4",
"r@ c #B2B3B3",
"s@ c #B0B0B0",
"t@ c #AFAFAF",
"u@ c #AAA9AA",
"v@ c #D3D3D3",
"w@ c #00A096",
"x@ c #059B92",
"y@ c #29A69E",
"z@ c #ACC8C7",
"A@ c #D2D1D1",
"B@ c #CCCCCD",
"C@ c #C4C4C4",
"D@ c #C0BFBF",
"E@ c #BBBCBB",
"F@ c #B2B3B2",
"G@ c #AEADAD",
"H@ c #ADACAD",
"I@ c #00ACA3",
"J@ c #009D93",
"K@ c #009B91",
"L@ c #00968E",
"M@ c #3CA7A1",
"N@ c #8EBFBD",
"O@ c #BDCCCB",
"P@ c #C1C0C0",
"Q@ c #C4C3C3",
"R@ c #C6C6C6",
"S@ c #BAB9B9",
"T@ c #ADACAC",
"U@ c #C8C8C8",
"V@ c #020B0A",
"W@ c #00B5AB",
"X@ c #00A299",
"Y@ c #009A91",
"Z@ c #00978E",
"`@ c #00958C",
" # c #04958D",
".# c #1B9B93",
"+# c #353535",
"@# c #414141",
"## c #464646",
"$# c #CECECE",
"%# c #C4C4C3",
"&# c #B1B2B1",
"*# c #C9C9C9",
"=# c #00BFB5",
"-# c #009C94",
";# c #009B93",
"># c #00968D",
",# c #00958B",
"'# c #00938A",
")# c #009189",
"!# c #009088",
"~# c #CCCCCC",
"{# c #B1B2B2",
"]# c #ADAEAD",
"^# c #CBCCCB",
"/# c #009890",
"(# c #00958D",
"_# c #00948B",
":# c #009289",
"<# c #009188",
"[# c #BFBFBF",
"}# c #CCCBCB",
"|# c #CFCFCE",
"1# c #00948A",
"2# c #008F88",
"3# c #008E86",
"4# c #CDCECE",
"5# c #BEBEBE",
"6# c #B7B7B8",
"7# c #B6B6B5",
"8# c #B3B2B2",
"9# c #B1B0B0",
"0# c #AFAFB0",
"a# c #00998F",
"b# c #00988E",
"c# c #00948C",
"d# c #008F87",
"e# c #B9B8B9",
"f# c #B6B7B6",
"g# c #B4B3B3",
"h# c #B2B1B1",
"i# c #ADADAE",
"j# c #ACADAD",
"k# c #C0C1C0",
"l# c #008D86",
"m# c #008C84",
"n# c #C3C4C4",
"o# c #B9BAB9",
"p# c #B0B0B1",
"q# c #CBCBC9",
"r# c #00AA9F",
"s# c #00928A",
"t# c #008D85",
"u# c #008B83",
"v# c #B7B8B7",
"w# c #B7B7B6",
"x# c #B1B0B1",
"y# c #C5C5C5",
"z# c #00968C",
"A# c #C5C6C6",
"B# c #C0C1C1",
"C# c #BABBBB",
"D# c #BABAB9",
"E# c #B8B7B7",
"F# c #B7B6B7",
"G# c #B5B4B4",
"H# c #B3B2B3",
"I# c #B1B1B2",
"J# c #ACADAE",
"K# c #009F97",
"L# c #009991",
"M# c #009389",
"N# c #008F86",
"O# c #008E85",
"P# c #008B84",
"Q# c #008981",
"R# c #BCBBBC",
"S# c #B9B9B9",
"T# c #B8B8B9",
"U# c #00938B",
"V# c #008D84",
"W# c #008C83",
"X# c #008A82",
"Y# c #008880",
"Z# c #C4C3C4",
"`# c #B7B8B8",
" $ c #AFAFB1",
".$ c #00A499",
"+$ c #008B82",
"@$ c #00877F",
"#$ c #C1C2C1",
"$$ c #B9B8B8",
"%$ c #B5B5B4",
"&$ c #B4B4B3",
"*$ c #B2B1B3",
"=$ c #009087",
"-$ c #008780",
";$ c #00867E",
">$ c #C2C3C2",
",$ c #B9B9BA",
"'$ c #B2B1B2",
")$ c #008A81",
"!$ c #00867D",
"~$ c #C0C0C1",
"{$ c #BFBEBE",
"]$ c #BEBDBD",
"^$ c #BDBCBD",
"/$ c #BFC0C0",
"($ c #C1C3C2",
"_$ c #009C92",
":$ c #009288",
"<$ c #00847D",
"[$ c #00847B",
"}$ c #BBBBBC",
"|$ c #BAB9BA",
"1$ c #B6B6B7",
"2$ c #B3B3B2",
"3$ c #BFC0BF",
"4$ c #008982",
"5$ c #00857E",
"6$ c #00847C",
"7$ c #00837B",
"8$ c #BEBEBF",
"9$ c #BDBCBC",
"0$ c #BCBCBB",
"a$ c #B3B4B3",
"b$ c #00877E",
"c$ c #00857D",
"d$ c #00837C",
"e$ c #00827A",
"f$ c #B7B6B6",
"g$ c #00978D",
"h$ c #00837A",
"i$ c #008178",
"j$ c #BFBFBE",
"k$ c #BDBEBC",
"l$ c #00978F",
"m$ c #008980",
"n$ c #008179",
"o$ c #007F78",
"p$ c #C1C1C2",
"q$ c #008E87",
"r$ c #00817A",
"s$ c #C2C2C1",
"t$ c #C0BFC0",
"u$ c #BDBEBE",
"v$ c #BBBBBA",
"w$ c #B9BABA",
"x$ c #009D95",
"y$ c #00867F",
"z$ c #008078",
"A$ c #007E78",
"B$ c #007D76",
"C$ c #C3C3C3",
"D$ c #BBBABA",
"E$ c #009A90",
"F$ c #008279",
"G$ c #007E77",
"H$ c #007D75",
"I$ c #C0C0BF",
"J$ c #BFBEBF",
"K$ c #BBBABB",
"L$ c #00887F",
"M$ c #00827B",
"N$ c #008079",
"O$ c #007B75",
"P$ c #BABABB",
"Q$ c #007C75",
"R$ c #007B73",
"S$ c #007A72",
"T$ c #C3C2C2",
"U$ c #BFBFC0",
"V$ c #BEBDBE",
"W$ c #BCBBBB",
"X$ c #00857C",
"Y$ c #007D77",
"Z$ c #007C76",
"`$ c #007B74",
" % c #007A73",
".% c #007972",
"+% c #C3C4C3",
"@% c #C5C5C6",
"#% c #BEBFBF",
"$% c #007871",
"%% c #BCBDBC",
"&% c #C4C5C4",
"*% c #C6C6C5",
"=% c #007770",
"-% c #00766F",
";% c #C3C2C3",
">% c #008C85",
",% c #007F77",
"'% c #007872",
")% c #00766E",
"!% c #C8C7C7",
"~% c #C7C6C6",
"{% c #C5C5C4",
"]% c #C2C0C1",
"^% c #B3B3B4",
"/% c #007E76",
"(% c #007870",
"_% c #00756F",
":% c #00756D",
"<% c #C9C8C8",
"[% c #C5C4C4",
"}% c #007A74",
"|% c #007971",
"1% c #00746E",
"2% c #00746D",
"3% c #C7C7C7",
"4% c #008881",
"5% c #00756E",
"6% c #00746C",
"7% c #00736C",
"8% c #00716A",
"9% c #C8C9C8",
"0% c #00716B",
"a% c #C6C7C7",
"b% c #CACBCA",
"c% c #C9C8CA",
"d% c #007771",
"e% c #00726B",
"f% c #006F69",
"g% c #007670",
"h% c #007069",
"i% c #006E68",
"j% c #000303",
"k% c #007169",
"l% c #007068",
"m% c #006D67",
"n% c #AEAFAE",
"o% c #00736B",
"p% c #00726A",
"q% c #A9A9A8",
"r% c #CFCFCF",
"s% c #C5C4C5",
"t% c #007973",
"u% c #00736D",
"v% c #006F68",
"w% c #B0AEB0",
"x% c #00726C",
"y% c #006D68",
"z% c #007C74",
"A% c #00706A",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" . + @ # ",
" $ $ $ $ $ $ $ $ $ $ $ % & * * = - ; > , ' ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) ! ~ { { ~ ] ^ / ( _ : ~ < ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ [ } | 1 2 3 4 5 6 7 $ $ $ $ $ $ 8 9 0 a b c d e ",
" $ $ $ $ $ $ $ $ $ $ f f g h i j k l m | | n 2 o p 5 6 q r s t $ $ $ $ u v w x ( ^ 8 ",
" $ $ $ $ $ $ $ $ y z z A A B C D E F G H I l J | n n 3 K 5 6 q q L M N $ $ $ $ O ( b P Q R * ",
" $ $ $ $ $ $ S S S T S U V V z W X C g E Y G H Z [ J | n ` .p ..7 +.@.#.$.%.&.$ $ $ *.=.-.;.>.,.'. ",
" $ $ $ $ $ U T T T ).).).T T S U V z B !.!.g F Y H I l ~.| {.].3 p 5 6 q @.s t %.&.^.$ $ $ /.(._.:.<.[.}. ",
" $ $ $ $ y |.T ).).1.1.1.1.2.3.4.T y y A B !.5.6.F j 7.Z [ 8.1 2 3 4 9.6 7 +.s t N 0.a.b.$ $ $ * c.d.e.f.g.'. ",
" $ $ $ $ A h.|.S 4.2.1.i.i.j.i.i.k.2.l.T y z A m.f g E i n.Z [ } | n 2 4 p o.7 +.L p.q.0.&.b.r.$ $ s.t.u.v.w.x.y. ",
" $ $ $ !.B z.y S T 1.i.j.A.B.B.C.B.D.k.3.4.S y z W !.f E Y G k [ J | E.F.o p o.7 q L M q.%.&.G.H.$ $ $ I.J.u.K.L.M.N. ",
" $ $ $ $ m.A h.S T 2.O.D.B.P.Q.Q.R.S.B.T.O.).T U V A !.f U.V.j n.l m | {.2 o 4 5 W.q X.#.t %.a.Y.Z.`.$ $ $ 9 0 +.+++e.@+u ",
" $ $ $ $ #+h.S 4.1.T.C.P.Q.$+$+$+Q.%+D.i.1.T |.h.A !.f g h G H l ~.} E.2 3 p 5 7 q r #.N %.&.&+*+=+`.$ $ - -+;+>+Q ,+'+ ",
" $ $ $ y T ).1.D.B.)+$+!+~+{+]+P.B.j.1.T S y A B !.g h G H l J | E.n 3 p p ^+/+@.#.t %.&.(+_+:+<+[+$ $ 9 }+|+1+2+3+4+5+ ",
" $ $ y T ).O.D.%+)+$+~+6+{+$+P.B.T.1.).S y A B f g F G H I [ 8.{.n .4 5 6 /+X.7+t %.&.8+9+0+<+[+$ $ $ - a+b+c+d+e+-+f+ ",
" $ $ $ T ).1.D.S.Q.$+{+g+{+$+R.A.D.1.).S z z.B h+6.F G 7.Z ~.8.E.].3 i+5 7 q @.#.t j+&.k+l+m+n+o+p+$ $ f+q+r+s+t+b+u+v+f+ ",
" $ $ $ l.2.D.C.%+Q.$+$+w+Q.P.D.i.1.l.S y A X f U.F G H l J } E.2 3 p o.6 q r #.$.%.&.G.x+y+z+A+p+B+$ $ C+q+D+E+F+x.G+H+|+I+O ",
" $ $ $ 3.i.D.B.P.P.Q.)+P.B.D.O.).T S z A m.f E F G 7.l J | {.2 .p ..6 q L #.q.%.&.G.J+K+L+M+N+O+P+Q+R+ S+T+U+V+W+V+X+Y+Z+`+ @-+.@L+ ",
" $ $ 4.1.k.j.A.B.B.B.C.j.i.).T S y A B !.f U.F +@k @@J | n 2 o p ..W.q @.t N %.a.b.#@$@%@&@*@=@-@;@}+>@,@'@)@/ !@~@D+V+X+{@]@^@/@(@_@ ",
" $ $ $ ).1.O.D.D.i.D.j.1.2.l.S |.z A m.C g E Y H k [ 8.| n ` 4 9.o.7 q L t q.%.a.b.:@<@[@}@|@1@;@2@3@g.4@5@6@7@8@9@)@0@a@b@E+c@H+d@e@ ",
" $ $ T ).).3.1.k.O.1.).4.T |.z A W !.f U.F +@7.l [ | E.f@` 4 5 W./+g@L p.N %.a.H.:+`.h@i@j@k@l@m@n@o@_ _ p@5@q@r@9@s@t@-+V+E+u@b+;@v@ ",
" $ $ $ S T T ).).T l.T S |.y #+W X f g h G H Z @@J | 1 2 3 i+5 7 q X.s t N &.^.w@:+<+o+x@y@z@A@B@C@D@a+m@E@4@/@5@7@F@s@t@0@G@H@{@(.=.A@ ",
" $ $ y U S S S S S U y z A A m.C g E F G n.Z [ 8.| n 2 4 I@5 W.q r #.q.%.&.a.H.`.J@K@p+B+L@M@N@O@P@Q@e@v@R@S@/@5@7@8@9@~@t@G@T@x.T@U@e@ ",
" V@$ $ z y V y y h.V z.A B m.!.D 6.F G H Z W@J | E.2 3 4 I@6 7 @.s M $.X@&.^.:@=+<+Y@p+Z@L@`@ #.#+#@### $#%#4@0 /@5@7@9@s@t@-+a@x.&#*#.@ ",
" $ $ A A z.A z #+=#A m.!.!.D 6.F G j k l m | | n 2 4 p 5 7 q r L t N &.a.b.:+-#;#Y@p+Z@>#,#'#)#!#$ $ ~#3@4@_ /@5@r@{#9@s@W+]#x.0 ^#$# ",
" $ $ $ B B B B B X !.f f g E V.F j k l [ J | 1 ].3 4 5 6 7 @.L #.q.%.&.^.H.:+J@o+Y@/#Z@(#_#:#<#!#$ $ $ q+[#4@_ 0 /@q@8@&#s@t@-+c@m@}#|# ",
" $ $ !.!.!.!.h+f D g 6.E F G H H l [ ~.| E.].F. .p 5 7 q @.s M N X@a.b.:@`.<+Y@p+B+>#`@1#:#<#2#3#$ $ 4#U@5#4@6#7#c.5@8#9@9#0#-+]@5#q+ ",
" $ $ $ g g g g 6.E h F G j H k Z @@J | | n 2 o p 5 6 7 @.X.#.t %.X@a.H.:+`.;#Y@a#b#>#c#'#:#!#d#3#$ $ ~#R@c e#4@f#0 5@g#8@h#s@i#j#k#k@ ",
" $ $ E F E V.h Y Y G H k k l [ J | E.n 2 3 4 9.6 W.q @.L t N %.&.b.:@=+J@o+p+B+Z@(#_#'#<#!#3#l#m#$ $ q+n#c o#n@_ 0 /@7@8#9@p#W+s@1@q# ",
" $ $ G i G G +@+@H k k I @@J J | E.{.2 3 4 p 5 6 r#@.L M $.%.X@a.b.:+J@<+o+p+b#>#`@1#s#<#!#3#t#u#$ $ U@2@d@a+4@v#w#0 q@r@9@x#-+7@y#*# ",
" $ $ H 7.7.H k k l [ [ ~.} E.E.n 2 3 4 p 5 6 /++.L L t %.&.&.b.H.:+J@o+Y@a#Z@z#_#'#<#<#d#3#t#u#$ $ $ A#B#d@C#D#E#F#,.G#7@H#I#J#F#y#U@ ",
" $ $ Z l l l l W@[ J } | E.{.].F.3 4 p I@^+7 +.X.#.M $.%.&.a.K#:@`.;#[+L#B+>#`@_#M#<#!#N#O#P#u#Q#$ $ y#;@R#m@S#T#_ 0 /@5@r@/ -+S#=. ",
" $ $ $ [ [ J J J 8.| E.{.n ].2 3 4 p 5 6 7 q @.L #.q.%.&.a.w@r.`.J@o+p+p+Z@>#_#U#:#!#d#3#V#W#X#Y#$ $ Z#[#c m@S#T#`#f#,.p@7@h# $m@y# ",
" $ $ } | 8.E.| E.1 n n 2 3 4 K I@5 6 /+q r L #.$..$X@a.b.H.:+-#o+Y@a#Z@>#`@'#'#<#!#3#l#m#+$Q#Y#@$$ $ C@#$5#g.c a+S@$$_ v+%$&$*$9@g.%# ",
" $ $ E.E.E.n n ].].F.3 4 K p 5 ..6 7 +.@.L #.t N %.&.b.H.:+`.<+o+L#B+Z@>#_#U#:#!#=$3#m#u#X#Q#-$;$$ $ >$3@[#g.c a+,$n@_ ,./@5@'$g#;@C@ ",
" $ $ $ f@2 2 2 ` 3 4 K p p 5 6 ^+/+g@@.L #.t N %.&.a.b.:@:+`.o+L#B+b#L@c#U#:#)#2#N#3#m#X#)$Y#@$!$$ $ $ 3@~${$]$^$m@a+S#4@f#,.5@8@/@/$($ ",
" $ $ 3 3 4 4 4 K p I@5 5 6 q q @.r #.M t N %.&.G.K#r.=+<+_$K@p+B+L@(#,#'#:$<#d#l#V#W#X#Q#@$;$<$[$$ $ ;@3@[#5#g.}$C#|$4@_ 1$/@2$7#3$3@ ",
" $ $ p i+K p 9.5 o.6 W.7 r#+.r L #.t q.N 0.a.G.b.:+=+J@;#Y@p+B+Z@z#`@1#:#<#=$3#t#m#u#4$Y#@$5$6$7$$ $ [#P@;@8$g.9$0$|$S#_ 0 /@a$E#;@ ",
" $ $ 5 5 ....o.6 6 /+q q @.L #.#.p.N %.0.&.G.K#r.=+-#<+Y@L#B+Z@>#`@_#'#:#!#d#3#t#u#X#Q#-$b$c$d$e$$ $ $ [#;@;@[#]$c R#a+,$n@f$0 a$S#{$ ",
" $ $ 6 W.7 r#q q +.@.L L #.#.q.j+%.0.a.G.w@:@:+`.;#o+L#B+B+g$(#_#'#)#<#d#3#t#P#X#Q#Y#@$!$6$h$e$i$$ $ g.{$B#k#D@j$k$0$a+S@n@_ 0 /@m@]$ ",
" $ $ q q q g@@.r L L #.M t N .$0.&.a.b.H.:@`.<+;#[+Y@B+l$g$`@_#'#:#<#!#d#l#m#u#X#m$-$;$c$7$e$n$o$$ $ c '@3@p$;@5#g.c m@a+S#`#0 1$C#c ",
" $ $ L r L #.s s M p.$.N %.%.0.a.a.b.H.:+`.`._$Y@p+a#b#g$(#_#'#'#)#!#q$3#V#u#X#Q#-$b$c$6$7$r$i$o$$ $ $ C#8$#$s$;@t$u$g.m@v$w$4@_ 1$v$0$ ",
" $ $ $ #.#.#.t t q.N %.%.&.&.a.b.w@r.:+x$<+o+K@p+p+Z@>#z#c#'#s#:$<#d#3#t#P#X#)$Y#y$;$<$d$e$i$z$A$B$$ $ a+3$C$l@k#[#'@^$c m@S#e#_ F#a+D$ ",
" $ $ N N N .$j+%.%.&.&.a.b.K#H.H.`.-#<+o+Y@E$a#Z@L@(#,#'#M#<#!#d#3#t#u#X#Q#Y#@$;$c$6$h$F$z$o$G$H$$ $ a+I$Q@1@;@;@J$g.c m@K$4@_ 4@S# ",
" $ $ j+X@&.X@&.&.a.^.G.K#H.:@:+J@J@o+[+Y@p+B+Z@>#z#,#U#:#<#<#!#N#t#m#u#X#Q#L$;$c$6$M$e$N$o$G$B$O$$ $ $ a+k#C@C$l@;@/$5#g.c P$S@4@4@4@ ",
" $ $ a.a.a.^.a.b.b.H.H.:+`.`.<+o+o+K@L#p+B+Z@>#`@_#'#:#)#<#2#3#t#m#u#X#Q#-$@$5$6$[$e$i$o$G$B$Q$R$S$$ $ v+,$T$y#C$1@3@U$J$V$c W$|$S#_ 4@ ",
" $ $ $ b.b.K#w@:@:+:+`.-#`._$o+K@Y@p+B+Z@L@z#`@_#'#M#<#<#=$q$t#m#u#X#Q#Y#@$5$X$d$e$F$z$A$Y$Z$`$ %.%$ $ 5@C#+%@%C$>$3@;@#%5#g.E@t.S#_ v+ ",
" $ $ :@H.:+=+:+`.-#<+_$o+[+E$p+B+B+L@>#(#`@U#'#:$<#!#d#3#O#V#u#X#)$Y#@$;$c$6$7$F$z$o$G$H$Q$R$.%$%$ $ q@%%&%*%n#C$1@3@[#]$g.d@K$,$0 5@ ",
" $ $ `.`.`.<+_$;#o+K@K@E$p+a#l$B+>#>#c#,#1#:#:#<#2#d#3#t#m#u#+$Q#Y#@$;$c$6$7$r$N$z$A$B$Q$`$.%.%=%-%$ $ 5@]$R@R@C@Q@;%k#D@#%5#^$c S#/@5@ ",
" $ $ <+_$_$o+[+[+Y@p+a#a#l$Z@L@>#(#_#1#'#'#:$!#=$N#3#t#>%u#X#Q#m$@$;$c$6$7$r$n$o$,%Y$Q$`$ %'%$%-%)%$ $ 5@[#!%~%{%C@>$]%p$;@t$5#g.4@^%5@ ",
" $ $ Y@Y@Y@Y@p+a#B+B+l$Z@Z@z#`@,#1#1#M#)#<#!#=$N#l#t#m#u#X#4$Y#@$;$c$6$7$e$n$z$G$/%Q$`$R$.%(%=%_%:%$ $ /@3@<%R@=.C@[%C$ /@5@ ",
" $ $ $ p+B+B+b#l$Z@Z@>#(#`@`@_#'#'#:#<#<#!#d#3#t#>%m#u#X#m$Y#@$;$c$6$7$e$n$z$o$G$H$Q$}%.%|%=%_%1%2%$ $ $ ]#,.C$|@3%y#C@ r@o# ",
" $ $ Z@Z@g$Z@>#>#`@c#_#_#'#:#:#:$!#!#d#d#t#t#V#u#u#X#4%Y#@$;$c$6$7$e$N$z$o$G$H$O$ %.%'%=%-%5%6%7%8%$ $ V+_ R@9%U@3% 4@9@ ",
" $ $ >#(#z#`@,#_#1#'#'#s#:#<#!#!#2#N#3#t#>%P#u#X#Q#Y#-$@$;$c$6$7$r$n$z$o$G$Z$`$`$ %.%=%-%_%2%7%0%8%$ $ -+|$a%b%c% c I# ",
" $ $ _#_#1#1#'#'#s#:#<#<#!#!#=$d#3#t#t#m#u#X#X#Q#Y#L$;$;$6$[$M$e$n$z$o$G$B$Q$`$ %.%d%=%5%2%7%e%8%f%$ $ r+%%q+B@ m@s@ ",
" $ $ M#M#s#:#:#:$<#!#<#!#d#q$3#t#t#m#m#u#X#Q#4%Y#@$;$5$<$6$e$e$i$z$A$Y$H$Q$`$S$.%(%g%5%1%6%e%8%h%i%$ $ j% -+[#,@ R@F@s@ ",
" $ $ )#<#<#<#!#!#!#d#N#q$l#l#V#m#W#u#X#Q#4%Y#-$;$;$c$6$7$M$r$z$z$o$G$H$Q$`$ %|%d%=%_%1%6%e%8%k%l%i%m%$ $ ~@3@~# *#%%n% ",
" $ $ $ !#2#d#q$d#3#3#t#t#m#P#u#u#X#)$4%Y#Y#@$;$!$X$[$7$M$F$i$z$,%Y$B$Q$`$S$.%$%g%-%5%2%o%p%h%h%i%m%m%$ $ q%9@m@3%r%}#s%c V+n% ",
" $ $ d#3#3#3#O#t#V#m#u#u#+$X#)$Q#Y#-$@$b$5$c$6$7$M$e$n$z$o$G$Y$Q$Q$R$t%'%$%=%_%2%u%7%p%8%f%v%m%m%m%$ $ 7@-+V+v s@X+X+ ",
" $ $ t#t#>%m#P#u#u#+$X#)$Q#Y#Y#-$b$b$;$c$6$7$h$e$F$z$o$o$G$B$Z$O$ % %.%d%-%-%1%6%7%0%k%f%v%m%m%m%m%$ $ 7@w%F@ ",
" $ $ u#u#u#u#u#X#Q#)$m$4%Y#@$@$b$!$c$6$6$h$M$e$n$z$z$A$G$B$Q$`$ %.%.%=%=%5%:%u%x%p%8%l%i%y%m%m%m%m%$ $ ",
" $ $ X#X#4$Q#Q#Q#m$Y#@$y$;$;$!$c$6$d$7$7$e$n$N$z$o$G$B$H$z%`$t%.%$%$%g%_%2%6%7%p%k%h%i%i%m%m%m%m%m%m%$ $ ",
" $ $ Y#Y#4%Y#Y#-$y$@$;$5$c$X$6$6$7$h$e$n$n$o$o$,%Y$Z$Q$`$`$ %.%(%=%-%)%2%7%x%0%h%h%i%m%m%m%m%m%m%m%m%$ $ ",
" $ $ @$b$;$@$;$;$!$c$c$6$6$7$7$e$r$n$N$z$o$,%G$B$B$Q$`$ %t%$%$%g%-%5%2%7%e%8%A%h%v%m%m%m%m%m%m%m%m%m%$ $ ",
" $ $ ;$5$!$c$X$c$6$6$7$7$h$e$n$n$z$z$o$,%G$Y$B$Q$z% % %.%$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ m%$ $ ",
" $ $ X$6$6$6$[$7$7$h$F$F$n$N$z$o$o$,%B$B$B$Q$`$R$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ 7$7$h$e$e$n$n$i$i$z$z$o$,%G$/%B$Q$Q$`$$ $ $ $ $ $ $ $ $ $ $ ",
" $ $ n$n$n$n$z$z$z$o$o$,%,%G$B$B$Q$Q$$ $ $ $ $ $ $ ",
" $ $ z$z$o$z$o$o$G$G$/%/%B$Z$Q$$ $ $ $ $ $ $ ",
" $ $ A$A$G$G$G$/%B$Q$H$O$z%$ $ $ $ $ $ ",
" $ $ B$B$B$Z$Q$Q$`$`$$ $ $ $ $ $ ",
" $ $ O$`$`$`$`$R$$ $ $ $ $ $ ",
" $ $ }% % % %$ $ $ $ $ $ $ ",
" $ $ |%$%$ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ ",
" j%$ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
" $ $ $ ",
" $ $ $ ",
" ",
" ",
" "};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

View File

@ -1,865 +0,0 @@
/* XPM */
static char * SliceIco_xpm[] = {
"128 128 734 2",
" c None",
". c #008F00",
"+ c #009100",
"@ c #008700",
"# c #007800",
"$ c #007700",
"% c #009900",
"& c #007B00",
"* c #007500",
"= c #007400",
"- c #007F00",
"; c #008D00",
"> c #008000",
", c #007900",
"' c #009F00",
") c #009000",
"! c #007D00",
"~ c #007600",
"{ c #008100",
"] c #008A00",
"^ c #008E00",
"/ c #009300",
"( c #009E00",
"_ c #00B200",
": c #00D600",
"< c #009400",
"[ c #00A100",
"} c #008800",
"| c #007A00",
"1 c #008300",
"2 c #00A500",
"3 c #00C000",
"4 c #00EA00",
"5 c #00FF00",
"6 c #009D00",
"7 c #007C00",
"8 c #008900",
"9 c #00E700",
"0 c #00FD00",
"a c #00FE00",
"b c #009C00",
"c c #00A700",
"d c #007300",
"e c #00A000",
"f c #00C200",
"g c #00F400",
"h c #00F700",
"i c #00FA00",
"j c #00A300",
"k c #007000",
"l c #00C100",
"m c #00DF00",
"n c #00E900",
"o c #00EF00",
"p c #008200",
"q c #008500",
"r c #007100",
"s c #007E00",
"t c #00AE00",
"u c #00CA00",
"v c #00D400",
"w c #00D700",
"x c #00DE00",
"y c #00E800",
"z c #00F600",
"A c #008C00",
"B c #008600",
"C c #007200",
"D c #008400",
"E c #00A900",
"F c #00BE00",
"G c #00C500",
"H c #00CC00",
"I c #00DA00",
"J c #00ED00",
"K c #009200",
"L c #00AD00",
"M c #00B700",
"N c #00C600",
"O c #00D800",
"P c #009800",
"Q c #00A800",
"R c #00BA00",
"S c #00D100",
"T c #00F200",
"U c #00B500",
"V c #00D500",
"W c #00FC00",
"X c #00EE00",
"Y c #00A200",
"Z c #00C900",
"` c #00EB00",
" . c #00F300",
".. c #00FB00",
"+. c #008B00",
"@. c #00E300",
"#. c #00F100",
"$. c #02FF02",
"%. c #03FF03",
"&. c #05F805",
"*. c #00BF00",
"=. c #05FF05",
"-. c #01FF01",
";. c #000000",
">. c #2DEC2D",
",. c #2DEC2C",
"'. c #2CEB2C",
"). c #2BEA2B",
"!. c #2AE92A",
"~. c #BDBDBD",
"{. c #BCBDBD",
"]. c #BCBCBC",
"^. c #BABBBA",
"/. c #FF0000",
"(. c #2AE82A",
"_. c #29E829",
":. c #C1C2C2",
"<. c #C1C1C1",
"[. c #C0C1C1",
"}. c #C0C0C0",
"|. c #BFC0C0",
"1. c #BFBFBF",
"2. c #BEBDBE",
"3. c #BCBDBC",
"4. c #BBBBBB",
"5. c #BABABA",
"6. c #2CEA2B",
"7. c #C3C3C3",
"8. c #C4C3C3",
"9. c #C3C3C4",
"0. c #C3C4C3",
"a. c #C3C2C3",
"b. c #C2C1C2",
"c. c #C1C1C2",
"d. c #BFC0BF",
"e. c #BEBEBF",
"f. c #BDBDBE",
"g. c #BDBCBC",
"h. c #BCBBBB",
"i. c #BABAB9",
"j. c #B9B9B9",
"k. c #2BEB2B",
"l. c #2BE92B",
"m. c #28E728",
"n. c #C2C2C3",
"o. c #C4C4C4",
"p. c #C5C5C5",
"q. c #C4C5C5",
"r. c #C5C4C4",
"s. c #BEBEBE",
"t. c #BDBEBE",
"u. c #BBBABA",
"v. c #B8B8B8",
"w. c #29E728",
"x. c #C2C2C2",
"y. c #C3C3C2",
"z. c #C5C6C6",
"A. c #C6C6C6",
"B. c #C7C6C6",
"C. c #C6C6C5",
"D. c #C6C5C6",
"E. c #C4C5C4",
"F. c #C3C4C4",
"G. c #C3C2C2",
"H. c #C1C0C0",
"I. c #C0BFBF",
"J. c #BDBCBD",
"K. c #BBBCBB",
"L. c #B8B8B9",
"M. c #B8B8B7",
"N. c #28E829",
"O. c #27E728",
"P. c #C2C2C1",
"Q. c #C2C3C2",
"R. c #C5C5C4",
"S. c #C7C7C7",
"T. c #C8C8C7",
"U. c #C6C6C7",
"V. c #C5C4C5",
"W. c #BFBFBE",
"X. c #BABBBB",
"Y. c #BAB9BA",
"Z. c #B8B7B8",
"`. c #B7B7B6",
" + c #2BEB2C",
".+ c #2AEA2A",
"++ c #27E627",
"@+ c #C1C1C0",
"#+ c #C9C8C9",
"$+ c #C9C9C9",
"%+ c #C9C9C8",
"&+ c #C8C9C9",
"*+ c #C8C8C8",
"=+ c #C7C6C7",
"-+ c #B7B7B7",
";+ c #B6B5B5",
">+ c #2CEA2C",
",+ c #C7C7C6",
"'+ c #C9CACA",
")+ c #CACBCB",
"!+ c #CACBCA",
"~+ c #CAC9CA",
"{+ c #C7C7C8",
"]+ c #BCBBBC",
"^+ c #BABABB",
"/+ c #B9B8B9",
"(+ c #B6B6B6",
"_+ c #B5B4B5",
":+ c #2AE929",
"<+ c #C0C0C1",
"[+ c #C8C9C8",
"}+ c #CACACA",
"|+ c #CBCBCB",
"1+ c #CCCCCC",
"2+ c #C9CAC9",
"3+ c #C9C8C8",
"4+ c #BFBEBE",
"5+ c #B5B5B4",
"6+ c #B4B4B3",
"7+ c #04F204",
"8+ c #CBCACB",
"9+ c #CDCECD",
"0+ c #CECDCE",
"a+ c #CDCDCD",
"b+ c #CBCBCC",
"c+ c #BBBBBA",
"d+ c #B7B6B6",
"e+ c #B5B4B4",
"f+ c #B3B3B3",
"g+ c #B2B2B2",
"h+ c #26E526",
"i+ c #C6C7C6",
"j+ c #CACACB",
"k+ c #CFCFCE",
"l+ c #C8C7C8",
"m+ c #BAB9B9",
"n+ c #B7B8B8",
"o+ c #B6B6B7",
"p+ c #B5B5B5",
"q+ c #B3B3B4",
"r+ c #B2B2B1",
"s+ c #29E929",
"t+ c #C4C4C3",
"u+ c #C9C9CA",
"v+ c #CECECE",
"w+ c #CBCCCC",
"x+ c #C2C1C1",
"y+ c #C0C1C0",
"z+ c #BEBEBD",
"A+ c #BCBCBB",
"B+ c #B7B8B7",
"C+ c #B6B7B6",
"D+ c #B4B5B4",
"E+ c #B0B1B0",
"F+ c #28E729",
"G+ c #C7C8C8",
"H+ c #CACAC9",
"I+ c #CBCCCB",
"J+ c #BFBEBF",
"K+ c #B4B4B4",
"L+ c #B3B4B3",
"M+ c #B0B0B0",
"N+ c #AEAFAF",
"O+ c #C5C5C6",
"P+ c #CBCACA",
"Q+ c #C6C5C5",
"R+ c #C2C3C3",
"S+ c #BEBFBE",
"T+ c #B1B2B1",
"U+ c #AFAEAF",
"V+ c #ADADAD",
"W+ c #2AE829",
"X+ c #25E425",
"Y+ c #B8B9B8",
"Z+ c #B5B6B5",
"`+ c #B1B1B1",
" @ c #AEAFAE",
".@ c #27E526",
"+@ c #26E525",
"@@ c #C8C7C7",
"#@ c #C7C8C7",
"$@ c #C5C6C5",
"%@ c #C4C4C5",
"&@ c #B9BAB9",
"*@ c #B6B7B7",
"=@ c #B0B0AF",
"-@ c #AEAEAE",
";@ c #ADADAC",
">@ c #ABACAB",
",@ c #27E527",
"'@ c #26E425",
")@ c #B9B9B8",
"!@ c #B1B0B1",
"~@ c #AFB0AF",
"{@ c #ADACAC",
"]@ c #ABAAAB",
"^@ c #28E627",
"/@ c #26E527",
"(@ c #C1C0C1",
"_@ c #B2B1B2",
":@ c #AFAFAF",
"<@ c #AEADAE",
"[@ c #ACACAC",
"}@ c #ABAAAA",
"|@ c #AAA9A9",
"1@ c #27E727",
"2@ c #25E325",
"3@ c #B8B9B9",
"4@ c #B7B7B8",
"5@ c #B3B3B2",
"6@ c #ADACAD",
"7@ c #AAAAAB",
"8@ c #A9A9A9",
"9@ c #A7A7A8",
"0@ c #24E324",
"a@ c #084808",
"b@ c #BDBDBC",
"c@ c #B5B5B6",
"d@ c #ACACAD",
"e@ c #ABABAB",
"f@ c #A9AAAA",
"g@ c #A8A8A8",
"h@ c #A7A7A6",
"i@ c #C0BFC0",
"j@ c #AFB0B0",
"k@ c #ABACAC",
"l@ c #AAAAAA",
"m@ c #A8A7A8",
"n@ c #A7A7A7",
"o@ c #A5A5A5",
"p@ c #BBBABB",
"q@ c #B9BABA",
"r@ c #ADAEAE",
"s@ c #A6A6A6",
"t@ c #A4A4A5",
"u@ c #BDBEBD",
"v@ c #B1B2B2",
"w@ c #B0AFB0",
"x@ c #AEAEAF",
"y@ c #A6A7A6",
"z@ c #A5A6A5",
"A@ c #A4A4A4",
"B@ c #25E526",
"C@ c #25E424",
"D@ c #23E224",
"E@ c #23E223",
"F@ c #B4B3B3",
"G@ c #AFAFAE",
"H@ c #AEADAD",
"I@ c #A9A8A8",
"J@ c #A7A8A7",
"K@ c #A4A5A5",
"L@ c #A3A3A3",
"M@ c #A2A2A3",
"N@ c #25E324",
"O@ c #04E804",
"P@ c #B9B8B8",
"Q@ c #B2B1B1",
"R@ c #ACABAB",
"S@ c #A5A4A4",
"T@ c #A2A3A3",
"U@ c #A2A2A1",
"V@ c #B9B9BA",
"W@ c #B1B0B0",
"X@ c #AAAAA9",
"Y@ c #A6A6A5",
"Z@ c #A5A5A4",
"`@ c #A1A1A1",
" # c #9FA0A0",
".# c #25E525",
"+# c #24E424",
"@# c #23E324",
"## c #23E122",
"$# c #B3B2B3",
"%# c #A9A9AA",
"&# c #A9A9A8",
"*# c #A8A7A7",
"=# c #A6A7A7",
"-# c #A2A2A2",
";# c #A1A0A0",
"># c #9F9F9F",
",# c #22E122",
"'# c #B1B1B0",
")# c #AFAFB0",
"!# c #ABABAA",
"~# c #A8A8A7",
"{# c #A7A6A6",
"]# c #A4A5A4",
"^# c #9F9FA0",
"/# c #9E9F9E",
"(# c #9D9D9D",
"_# c #23E123",
":# c #B2B2B3",
"<# c #A5A6A6",
"[# c #A5A4A5",
"}# c #A0A09F",
"|# c #9F9E9F",
"1# c #9C9D9C",
"2# c #24E325",
"3# c #24E223",
"4# c #23E222",
"5# c #B2B3B3",
"6# c #B1B1B2",
"7# c #AEAEAD",
"8# c #AAA9AA",
"9# c #A8A9A9",
"0# c #A4A4A3",
"a# c #A3A2A3",
"b# c #9D9E9E",
"c# c #9C9C9D",
"d# c #9C9B9B",
"e# c #21E021",
"f# c #AFAEAE",
"g# c #ABABAC",
"h# c #A3A4A4",
"i# c #A09F9F",
"j# c #9E9E9E",
"k# c #9C9C9C",
"l# c #9A9B9B",
"m# c #99999A",
"n# c #23E323",
"o# c #21E022",
"p# c #ADAEAD",
"q# c #ACADAD",
"r# c #AAABAA",
"s# c #A9A8A9",
"t# c #A7A8A8",
"u# c #9C9D9D",
"v# c #9B9B9B",
"w# c #9A999A",
"x# c #999898",
"y# c #24E224",
"z# c #AAABAB",
"A# c #A1A2A2",
"B# c #A0A1A0",
"C# c #9E9E9F",
"D# c #9D9E9D",
"E# c #9B9C9B",
"F# c #9A9B9A",
"G# c #999999",
"H# c #989898",
"I# c #22E222",
"J# c #22E021",
"K# c #20E020",
"L# c #ADADAE",
"M# c #ACADAC",
"N# c #A8A9A8",
"O# c #A2A3A2",
"P# c #A2A1A2",
"Q# c #A1A1A0",
"R# c #A0A0A0",
"S# c #9F9E9E",
"T# c #9E9E9D",
"U# c #9B9B9C",
"V# c #9A9A9A",
"W# c #979797",
"X# c #24E323",
"Y# c #20DF20",
"Z# c #ACABAC",
"`# c #A5A5A6",
" $ c #A09FA0",
".$ c #9D9C9D",
"+$ c #969696",
"@$ c #959595",
"#$ c #21DF21",
"$$ c #A4A3A4",
"%$ c #9FA09F",
"&$ c #9F9F9E",
"*$ c #9C9B9C",
"=$ c #969796",
"-$ c #959596",
";$ c #949494",
">$ c #A8A8A9",
",$ c #A3A3A2",
"'$ c #9E9D9D",
")$ c #9B9A9B",
"!$ c #999A9A",
"~$ c #979798",
"{$ c #939393",
"]$ c #1FDE1F",
"^$ c #A4A3A3",
"/$ c #A1A1A2",
"($ c #A0A1A1",
"_$ c #999998",
":$ c #989897",
"<$ c #929393",
"[$ c #22E022",
"}$ c #A6A5A5",
"|$ c #A1A2A1",
"1$ c #9D9D9E",
"2$ c #989797",
"3$ c #969695",
"4$ c #959495",
"5$ c #929293",
"6$ c #919291",
"7$ c #909190",
"8$ c #20DF21",
"9$ c #1FDF20",
"0$ c #A3A3A4",
"a$ c #9E9F9F",
"b$ c #999A99",
"c$ c #989998",
"d$ c #969697",
"e$ c #969596",
"f$ c #949594",
"g$ c #949393",
"h$ c #929392",
"i$ c #919191",
"j$ c #909090",
"k$ c #8F8F8F",
"l$ c #20E021",
"m$ c #A0A0A1",
"n$ c #9D9D9C",
"o$ c #959594",
"p$ c #949394",
"q$ c #939292",
"r$ c #8F9090",
"s$ c #8E8F8E",
"t$ c #21E121",
"u$ c #1FDD1F",
"v$ c #969595",
"w$ c #959494",
"x$ c #929292",
"y$ c #929192",
"z$ c #909191",
"A$ c #8F8F90",
"B$ c #8E8E8E",
"C$ c #8D8D8D",
"D$ c #20DE1F",
"E$ c #1EDD1E",
"F$ c #9C9C9B",
"G$ c #9B9B9A",
"H$ c #929191",
"I$ c #8F908F",
"J$ c #8E8E8F",
"K$ c #8C8C8C",
"L$ c #9A9A9B",
"M$ c #9A9A99",
"N$ c #979898",
"O$ c #979697",
"P$ c #949595",
"Q$ c #929291",
"R$ c #908F8F",
"S$ c #8E8E8D",
"T$ c #8C8D8C",
"U$ c #8B8B8B",
"V$ c #8A8A8A",
"W$ c #1EDE1F",
"X$ c #059A05",
"Y$ c #9D9C9C",
"Z$ c #989798",
"`$ c #959696",
" % c #939493",
".% c #919292",
"+% c #8A8B8A",
"@% c #898989",
"#% c #1FDF1F",
"$% c #1DDC1D",
"%% c #9B9C9C",
"&% c #949493",
"*% c #919090",
"=% c #8F8F8E",
"-% c #8C8C8D",
";% c #898988",
">% c #1FDE20",
",% c #1DDD1E",
"'% c #969797",
")% c #90908F",
"!% c #8D8D8E",
"~% c #89898A",
"{% c #888888",
"]% c #878787",
"^% c #1FDD1E",
"/% c #1EDD1D",
"(% c #017501",
"_% c #939494",
":% c #8E8D8D",
"<% c #8D8C8D",
"[% c #868686",
"}% c #1CDC1D",
"|% c #004C00",
"1% c #979796",
"2% c #8E8F8F",
"3% c #898A8A",
"4% c #898889",
"5% c #858585",
"6% c #1DDC1C",
"7% c #1CDB1C",
"8% c #959695",
"9% c #939293",
"0% c #919091",
"a% c #8C8B8C",
"b% c #8A8989",
"c% c #878788",
"d% c #848585",
"e% c #848484",
"f% c #838383",
"g% c #1EDC1D",
"h% c #8C8B8B",
"i% c #898888",
"j% c #878887",
"k% c #878686",
"l% c #858686",
"m% c #858484",
"n% c #848483",
"o% c #828283",
"p% c #828282",
"q% c #1EDC1E",
"r% c #1CDA1C",
"s% c #888889",
"t% c #868586",
"u% c #848485",
"v% c #838282",
"w% c #808180",
"x% c #1CDC1C",
"y% c #1BDA1B",
"z% c #020A02",
"A% c #8E8D8E",
"B% c #8D8D8C",
"C% c #8C8C8B",
"D% c #888788",
"E% c #818182",
"F% c #818080",
"G% c #808080",
"H% c #1BDB1B",
"I% c #1B901B",
"J% c #000600",
"K% c #898A89",
"L% c #858685",
"M% c #858584",
"N% c #828383",
"O% c #818281",
"P% c #7F807F",
"Q% c #7F7F7E",
"R% c #1BDB1C",
"S% c #8D8E8D",
"T% c #8B8B8A",
"U% c #868786",
"V% c #858586",
"W% c #818282",
"X% c #818181",
"Y% c #7F7F7F",
"Z% c #7F7E7E",
"`% c #7E7D7E",
" & c #1DDB1D",
".& c #1BDA1C",
"+& c #8D8C8C",
"@& c #8B8A8A",
"#& c #8A8A89",
"$& c #878786",
"%& c #838382",
"&& c #7E7E7E",
"*& c #7E7D7D",
"=& c #7C7C7D",
"-& c #8A8B8B",
";& c #888988",
">& c #888787",
",& c #868685",
"'& c #7E7E7F",
")& c #7D7E7E",
"!& c #7D7D7D",
"~& c #7C7C7C",
"{& c #7B7B7B",
"]& c #1CDB1B",
"^& c #878687",
"/& c #848384",
"(& c #808081",
"_& c #7D7D7C",
":& c #7C7C7B",
"<& c #7A797A",
"[& c #257225",
"}& c #868787",
"|& c #838484",
"1& c #828382",
"2& c #808181",
"3& c #807F7F",
"4& c #7E7F7E",
"5& c #7D7C7D",
"6& c #7A7B7B",
"7& c #797A7A",
"8& c #797979",
"9& c #848383",
"0& c #828181",
"a& c #818081",
"b& c #7C7D7D",
"c& c #7B7C7C",
"d& c #7A7A7A",
"e& c #79797A",
"f& c #787878",
"g& c #7D7D7E",
"h& c #7B7C7B",
"i& c #787979",
"j& c #828281",
"k& c #807F80",
"l& c #7B7B7A",
"m& c #04FD04",
"n& c #818180",
"o& c #7E7E7D",
"p& c #7D7C7C",
"q& c #7D7E7D",
"r& c #7F7E7F",
"s& c #7C7D7C",
"t& c #7C7B7C",
"u& c #7B7B7C",
"v& c #7C7B7B",
"w& c #7B7A7B",
"x& c #797978",
"y& c #797878",
"z& c #021902",
"A& c #00BD00",
"B& c #00CF00",
"C& c #009700",
"D& c #00D000",
"E& c #00DC00",
"F& c #00E500",
"G& c #00F500",
"H& c #00A400",
"I& c #00B400",
"J& c #00E400",
"K& c #00F900",
"L& c #00B100",
"M& c #00C400",
"N& c #009600",
"O& c #00E600",
"P& c #00B000",
"Q& c #00B800",
"R& c #00C300",
"S& c #00B300",
"T& c #009500",
"U& c #00E100",
"V& c #00BB00",
"W& c #00F800",
"X& c #009B00",
"Y& c #009A00",
" ",
" ",
" ",
" ",
" ",
" . + @ # $ # ",
" % . & * = = $ - ; > , ",
" ' ) ! ~ ~ $ & { ] ^ / ( _ : < ~ ",
" [ } , # # # | ! - 1 + 2 3 4 5 5 5 5 5 6 * ",
" [ } # , , , , # # 7 8 [ 3 9 0 a a a 5 5 5 5 5 5 b * ",
" c ^ 7 | & 7 & $ = d $ @ e f 4 g g h i a 5 5 5 5 5 5 5 5 5 5 b * ",
" j } , ! - - , = k k $ @ e l m 9 n o h 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" 1 7 p q 1 , r k d s / t u v w x y z 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" 8 A B | C r ~ D < E F G H I J 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" K K 1 ~ d C $ { . e L M N O J 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" P . ! * = = # > A P ' Q R S T 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ( A , ~ ~ , 7 { } A + ' U V W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" e B # # # , & ! s D < E G n a 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ; , , # $ ! A 2 N X 0 0 0 a 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" A 7 Y Z ` T .z ..5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.+.@...5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.. g 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 $.%.&.*.*.*.*.*.*.*.*.*.*.*.=.-.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 $.;.;.;.;.;.;.;.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 -.;.;.;.;.;.;.;.;.;.;.;.;.*.>.,.'.'.'.).).).!.!.*.*.*.*.*.*.$.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 ;.;.;.;.;.;.;.;.;.;.~.{.].^././././.>.'.'.'.'.).).).!.!.(._._.*.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 ;.;.;.;.;.;.;.;.:.<.[.}.|.1.2.3.4.5././././.>.'.'.'.6.).).!.!.!._._._.*.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ ;.;.;.;.;.;.7.8.9.0.7.a.b.c.[.d.e.f.g.h.i.j./././.>.'.'.k.).).l.!.!.!._._.m.m.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.;.;.n.0.o.o.p.p.q.r.o.8.a.b.<.1.s.t.].u.i.v./././.'.'.'.).).).!.!.!._._.w.m.m.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.;.x.y.o.q.p.z.A.B.A.C.D.E.F.G.:.H.I.s.J.K.5.L.M./././.'.'.).).).!.!.!._._.N.m.m.O.*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.;.}.P.Q.8.R.C.B.S.S.T.S.S.U.C.V.o.x.<.}.W.~.g.X.Y.Z.`./././.'. +).)..+!.!._._._.m.m.O.++*.*.%.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.s.I.@+x.9.o.A.S.T.#+$+$+%+&+*+=+D.R.7.x.<.d.t.{.4.i.j.-+;+/././.>+).)..+!.!._._._.m.m.m.++*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.;.W.}.P.7.o.C.,+*+$+'+)+)+!+~+$+{+,+p.o.n.c.}.s.~.]+^+/+Z.(+_+/././.).).).!.!.:+_._.m.m.m.++++*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.;.<+P.9.E.A.{+[+}+|+1+1+1+)+2+3+S.A.o.y.P.}.4+~.].^.j.v.(+5+6+/././.).).!.!.(._._.m.m.m.++++++*.*.7+5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.x.o.q.B.*+$+8+1+9+0+a+b+}+$+T.A.o.8.x.}.1.t.].c+j.v.d+e+f+g+/././.).!.!.!._._.m.m.m.++++++h+*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.x.0.p.i+*+2+j+1+0+k+a+1+}+$+l+A.p.7.:.H.1.~.].u.m+n+o+p+q+r+/././.).!.!.s+_._.w.m.m.++++++h+*.*.*.5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.t+p.A.*+u+)+1+a+v+a+w+!+#+*+A.p.7.x+y+1.z+A+u.j.B+C+D+q+g+E+/././.!.!.!._._.F+m.m.++++++h+h+*.*.&.5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ;.;.;.V.C.G+[+H+|+1+1+I+|+'+*+S.A.V.7.:.}.J+~.]+5.j.n+(+K+L+g+M+N+/././.!.(._._.m.m.m.++++++h+h+h+*.*.5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.;.;.;.O+S.*+$+}+P+)+j+'+&+G+i+Q+o.R+<.}.S+~.4.u.j.B+(+K+f+T+M+U+V+/./.!.W+_._.m.m.m.++++++h+h+X+*.*.*.5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ ;.;.R.A.=+T.#+$+$+$+[+T.S.Q+r.7.x.H.1.s.{.]+5.Y+-+Z+K+f+`+M+ @V+/././.!._._.m.m.m.++++.@h+h++@X+*.*.5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ ;.;.;.p.A.,+G+G+@@*+#@B.$@%@8.Q.x+}.S+f.].4.&@v.*@;+q+f+`+=@-@;@>@/././._._.m.m.m.++++,@h+h+'@X+*.*.*.5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.;.;.F.p.Q+D.A.U.,+A.p.R.o.y.x+H.d.s.~.]+5.)@M.(+p+f+g+!@~@-@{@]@/././._._.m.m.^@++++/@h+h+X+X+X+*.*.5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.;.;.;.9.o.o.p.p.r.V.o.8.Q.x.(@d.J+~.].^.m+v.`.Z+K+f+_@M+:@<@[@}@|@/././.N.m.m.1@++++h+h+h+X+X+2@*.*.*.5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 ;.;.x.a.7.7.9.8.7.n.x.<.H.|.S+f.].4.5.3@4@C+p+q+5@`+M+-@6@[@7@8@9@/./.m.m.m.++++++h+h+h+X+X+2@0@*.*.5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 a@;.;.<.x.b.x.x.P.b.@+}.1.S+t.b@K.5.j.v.`.c@K+f+g+M+:@-@d@e@f@g@h@/././.m.m.++++++h+h+X+X+X+X+0@*.*.*.5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 ;.;.|.}.@+}.[.<+i@|.W.s.t.3.K.5.m+L.-+(+_+f+5@`+j@-@V+k@l@8@m@n@o@/./.m.m.++++/@h+h+X+X+X+0@0@0@*.*.5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 ;.;.;.1.1.1.1.1.J+s.~.~.].4.p@q@L.-+(+p+K+f+_@E+:@r@[@e@l@g@n@s@t@/././.++++++h+h+h+X+X+X+0@0@0@*.*.*.5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 ;.;.t.s.t.t.u@~.b@].K.4.5.j.v.v.(+;+5+f+v@E+w@x@V+[@}@|@g@y@z@A@/././.++++++h+h+B@X+X+C@0@0@D@E@*.*.5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 ;.;.;.].].g.].A+h.c+5.m+/+v.-+C+Z+K+F@5@`+M+G@H@[@e@l@I@J@s@K@L@M@/./.++++,@h+h++@X+X+N@0@0@E@E@*.*.O@5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 ;.;.4.u.4.p@^.i.i.j.P@-+-+(+p+K+F@g+Q@M+:@r@;@R@7@8@g@n@o@S@T@U@/././.++h+h+h+X+X+X+0@0@0@E@E@E@*.*.5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 ;.;.j.V@j.j.)@Y+v.-+-+o+Z+e+K+f+g+T+W@:@-@V+k@e@X@g@n@Y@Z@L@M@`@ #/./.++h+h+.#X+X++#0@0@@#E@E@##*.*.-.5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 O@;.;.v.B+M.n+-+*@(+;+p+D+6+$#g+`+M+:@-@V+[@e@%#&#*#=#o@L@-#U@;#>#/./.h+h+h+X+X+X+0@0@0@E@E@E@,#*.*.*.5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 ;.;.C+(+(+(+(+c@p+K+L+f+g+T+'#)#:@-@H@d@!#l@&#~#{#Y@]#L@-#`@^#/#(#/./.h+h+X+X+X+0@0@0@E@E@_#,#,#*.*.5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 ;.;.;.p+p+e+K+K+q+f+:#r+`+E+M+N+-@V+[@e@l@8@g@n@<#[#L@-#`@}#|#(#1#/./.h+X+X+X+2#0@0@3#E@E@4#,#,#*.*.&.5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 $.;.;.L+F@q+$#5#g+6#Q@`+M+:@-@7#6@k@e@8#9#m@n@s@]#0#a#`@;#>#b#c#d#/./.X+X+X+N@0@0@0@E@E@E@,#,#,#e#*.*.5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 ;.;.g+v@v@`+`+'#E+w@:@f#7#V+[@g#e@l@&#g@n@s@o@h#L@-#;#i#j#(#k#l#m#/./.X+X+2#0@0@n#E@E@,#,#,#o#e#*.*.-.5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 ;.;.;.!@M+M+j@~@N+f#p#V+q#[@e@r#8#s#t#n@s@o@A@L@U@`@ #/#j#u#v#w#x#/./.X+2#0@0@y#E@E@E@,#,#,#e#e#*.*.*.5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 $.;.;.:@:@f#-@-@p#V+6@[@k@z#8@8@g@m@s@Y@K@h#L@A#B#^#C#D#k#E#F#G#H#/./.X+0@0@0@E@E@E@I#,#,#J#e#e#K#*.*.5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 ;.;.V+L#p#V+M#[@>@e@7@l@X@N#m@n@s@o@t@A@O#P#Q#R#S#T#1#U#V#G#H#W#/././.0@0@X#E@E@E@,#,#,#e#e#e#Y#*.*.$.5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 ;.;.[@[@Z#Z#>@e@z#%#|@8@g@n@{#s@`#S@L@O#-#Q# $C#T#.$k#V#m#x#W#+$@$/./.0@0@E@E@E@,#,#,#o#e#e##$Y#*.*.*.5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 &.;.;.e@7@l@X@8@9#N#t#n@n@s@<#t@$$L@O#`@B#%$&$j#(#*$v#m#x#H#=$-$;$/./.0@E@E@E@_#,#,#,#e#e#e#Y#Y#Y#*.*.5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 ;.;.8@8@8@>$g@9@n@=#s@Y@o@A@0#,$-#`@R#>#&$'$k#*$)$!$x#~$=$@$;${$/./.0@E@E@E@,#,#,#o#e#e#Y#Y#Y#]$*.*.-.5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 ;.;.n@9@n@{#h@y@z@`#]#A@^$L@O#/$($R#>#j#(#u#E#V#G#_$:$=$-$;${$<$/././.E@E@,#,#,#[$e#e#e#Y#Y#Y#]$*.*.*.5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 ;.;.;.s@s@<#}$o@t@A@^$L@-#|$`@R#%$|#j#1$k#d#F#G#G#2$+$3$4${$5$6$7$/./.E@_#,#,#,#e#e#e#8$Y#Y#9$]$]$*.*.5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 %.;.;.A@S@A@0#0$L@L@|$-#`@;# $>#a$(#.$k#v#V#b$c$W#d$e$f$g$h$i$j$k$/./.##,#,#,#e#e#e#l$Y#Y#Y#]$]$]$*.*.-.b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 ;.;.0$a#-#M@-#A#`@m$B#^#>#/#j#n$1#v#)$V#G#x#W#+$3$o$p$q$i$i$r$s$/./.,#,#,#t$e#e#e#Y#Y#Y#]$]$]$u$*.*.*.b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 ;.;.P#P#`@m$`@R# #>#>#j#'$(#k#v#v#F#m#G#H#W#+$v$w${$x$y$z$A$B$C$/./.,#,#[$e#e#e#K#Y#Y#D$]$]$]$E$E$*.*.b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 ;.;.;.R#R#^#%$&$S#j#(#.$u#F$v#G$V#G#H#W#d$3$@$;${$h$H$7$I$J$C$K$/././.,#e#e#e#8$Y#Y#Y#]$]$]$E$E$E$*.*.b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 %.;.;.&$a$j#T#j#(#c#k#E#v#L$M$G#x#N$O$+$-$P$p${$Q$i$j$R$B$S$T$U$V$/./.e#e#e#e#Y#Y#Y#]$]$]$W$E$E$E$*.*.X$* ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 ;.;.'$(#(#Y$F$*$v#F#F#b$G#c$Z$N$+$`$4$f$ %x$.%i$A$k$B$C$K$U$+%@%/./.e#e#l$Y#Y#Y##%]$]$W$E$E$E$$%$%*.= * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 ;.;.%%E#E#v#L$L$V#G#_$_$Z$2$O$+$e$;$&%{$<$Q$*%I$=%B$C$-%U$V$@%;%/./.e#e#Y#Y#Y#>%]$]$]$E$E$E$,%$%$%*.= * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 ;.;.V#V#!$!$G#_$H#H#Z$W#'%3$@$f$&%&%h$y$z$j$)%=%!%C$K$U$V$~%{%]%/./.e#Y#Y#Y#Y#]$]$]$^%E$E$/%$%$%$%*.= (% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 ;.;.;.G#H#H#:$Z$W#W#+$-$@$P$_%{$<$x$H$i$j$k$B$:%<%K$U$V$;%{%]%[%/./.Y#Y#Y#Y#]$]$]$W$E$E$E$$%$%$%}%*.= |% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 $.;.;.W#W#1%'%+$`$@$4$;$;${$x$x$Q$j$j$k$2%:%C$T$U$U$3%4%{%]%[%5%/./.Y#Y#Y#]$]$]$u$E$E$E$$%$%$%6%7%7%= |% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 ;.;.`$-$8%@$o$;$&%{$<$9%x$i$0%j$A$s$B$C$<%a%U$V$b%{%c%]%[%d%e%f%/./.Y#]$]$]$^%E$E$E$g%$%$%$%7%7%7%= |% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 ;.;.;$;$&% %{${$5$x$i$z$j$j$)%k$B$:%C$K$h%V$3%@%i%j%k%l%m%n%o%p%/./.]$]$]$]$E$E$E$q%$%$%$%7%7%7%r%= |% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 ;.;.h$h$5$x$x$Q$i$0%7$j$k$J$B$C$C$K$K$U$V$b%s%{%]%[%t%u%e%v%p%w%/./.]$]$]$E$E$E$/%$%$%$%x%7%7%7%y%= |%z% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 ;.;.y$H$i$i$j$j$r$k$=%J$A%!%B%K$C%U$V$b%4%{%D%[%[%5%e%f%o%E%F%G%/./.]$]$E$E$E$q%$%$%$%x%7%7%7%H%y%I%|%J% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 ;.;.;.r$A$R$J$k$B$B$:%C$K$a%U$U$V$K%4%{%{%]%[%L%M%n%N%o%O%w%P%Q%/./.W$E$E$E$,%$%$%$%$%7%7%7%R%y%y%I%|%J% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 $.;.;.2%B$B$B$S%C$B%K$h%U$T%V$K%@%i%c%]%U%V%5%e%f%o%W%X%G%Y%Z%`%/./.E$E$E$E$$%$%$% &7%7%7%.&y%y%y%I%|%J% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.C$C$-%+&a%h%U$+%@&#&@%i%i%D%$&$&[%5%m%f%%&p%O%F%Y%Y%&&*&=&/./.E$E$q%$%$%$%6%7%7%7%.&y%y%y%y%I%|%J% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.h%h%U$U$-&V$@%#&;&s%{%>&]%U%,&5%e%e%%&o%p%X%G%P%'&)&!&~&{&/./.E$$%$%$%$% &7%7%7%]&y%y%y%y%y%I%|%J% ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.V$3%~%@%@%@%;&{%]%^&[%[%L%5%e%/&f%N%W%X%(&G%Y%&&!&_&:&{&<&/./.,%$%$%$%x%7%7%7%R%y%y%y%y%y%y%I%[&J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.{%{%s%{%{%c%^&}&[%V%5%M%e%|&f%1&p%X%2&3&Y%4&`%5&~&{&6&7&8&/./.$%$%$%7%7%7%7%R%y%y%y%y%y%y%y%I%[&J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.]%$&k%}&[%[%L%5%5%e%|&9&f%p%E%0&a&G%Y%Q%&&!&b&c&{&d&e&f&f&/./.$%$%7%7%7%7%R%y%y%y%y%y%y%y%y%I%[&J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.[%t%L%5%M%d%e%|&f%f%1&p%X%X%G%G%Y%Q%&&g&!&~&h&d&7&i&;.;.;.;.;.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.= [&J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.M%e%|&|&n%f%f%%&j&O%X%a&G%k&Y%Q%*&*&b&~&{&l&;.;.;.;.;.;.;.;.;.*.*.*.*.*.7+m&O@*.*.*.*.*.*.*.= |%J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.f%f%1&p%p%X%X%n&n&G%G%Y%4&&&o&!&p&~&{&;.;.;.;.;.;.;.;.$.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 -.X$|%J%;. ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.X%X%X%2&G%G%G%k&Y%4&Q%)&!&!&~&~&;.;.;.;.;.;.;.$.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.G%G%k&P%Y%Y%Z%&&o&q&!&=&~&;.;.;.;.;.;.;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.r&r&&&&&&&o&!&~&s&t&:&;.;.;.;.;.;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.!&b&!&5&~&~&{&{&;.;.;.;.;.;.-.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.u&v&{&{&{&l&;.;.;.;.;.;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.w&d&d&7&;.;.;.;.;.%.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.x&y&;.;.;.;.;.-.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.;.;.;.;.;.-.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.;.;.;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 ;.;.;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 z&;.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.^ #.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.) h 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" A D A&B&x T a 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" ; ~ r ! C&U D&O E&9 z 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" | > s # d k d > 6 f F&n J G&0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" H&} , | & & # * d 7 ) I&J&z h K&0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" e D # , , , , # s + L&E&5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" c K & # # , 7 > 1 A Y M&o 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" N&s $ * $ & 1 A K 6 U w 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" P ; & = = $ { . ' j t M&O&0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" . ) > * C r # @ 6 P&Q&R&I g 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" } } s d k d s P S&Z D&x .5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" +.& > D { ~ r r s T&M v E&U&` i 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 b * ",
" 6 7 & - s # C k $ } 2 H 4 ` o z 0 5 5 5 5 5 5 5 5 5 5 b * ",
" H&@ # & & | $ * = - T&V&O&h W&i W 5 5 5 5 5 5 b * ",
" X&s , , , , , | 7 } j Z G&5 5 5 5 5 b * ",
" H&) & $ $ $ & > 1 8 Y&R F&5 ( * ",
" 6 } $ ~ * # p +.C&p , ",
" C&+ 7 = d ~ , ",
" ; ^ 1 ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "};

View File

@ -1,41 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
class SurfWorkbench ( Workbench ):
""" @brief Workbench of Ship design module. Here toolbars & icons are append. """
from surfUtils import Paths, Translator
import SurfGui
Icon = Paths.iconsPath() + "/Ico.png"
MenuText = str(Translator.translate("Surface tools"))
ToolTip = str(Translator.translate("Surface tools"))
def Initialize(self):
# ToolBar
list = ["Surf_IsoCurve", "Surf_SliceCurve", "Surf_Border", "Surf_Convert"]
self.appendToolbar("Surface tools",list)
# Menu
list = ["Surf_IsoCurve", "Surf_SliceCurve", "Surf_Border", "Surf_Convert"]
self.appendMenu("Surface tools",list)
Gui.addWorkbench(SurfWorkbench())

View File

@ -1,52 +0,0 @@
# Change data dir from default ($(prefix)/share) to actual dir
datadir = $(prefix)/Mod/Surfaces
data_DATA = InitGui.py \
SurfGui.py
nobase_data_DATA = \
Icons/BorderIco.png \
Icons/BorderIco.xcf \
Icons/BorderIco.xpm \
Icons/ConvertIco.png \
Icons/ConvertIco.xcf \
Icons/ConvertTo4SidesIco.xpm \
Icons/Ico.png \
Icons/Ico.xcf \
Icons/Ico.xpm \
Icons/IsoCurveIco.png \
Icons/IsoCurveIco.xcf \
Icons/IsoCurveIco.xpm \
Icons/SliceIco.png \
Icons/SliceIco.xcf \
Icons/SliceIco.xpm \
surfBorder/__init__.py \
surfConvert/__init__.py \
surfConvert/Preview.py \
surfConvert/TaskPanel.py \
surfConvert/TaskPanel.ui \
surfISOCurve/__init__.py \
surfISOCurve/PointTracker.py \
surfISOCurve/Preview.py \
surfISOCurve/TaskPanel.py \
surfISOCurve/TaskPanel.ui \
surfSlice/__init__.py \
surfSlice/PointTracker.py \
surfSlice/Preview.py \
surfSlice/TaskPanel.py \
surfSlice/TaskPanel.ui \
surfUtils/Geometry.py \
surfUtils/__init__.py \
surfUtils/Math.py \
surfUtils/Paths.py \
surfUtils/Translator.py
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
$(nobase_data_DATA) \
CMakeLists.txt \
README \
surfaces.dox

View File

@ -1,11 +0,0 @@
* Authors
---------
Jose Luis Cercós Pita <jlcercos@gmail.com>
Alicia Lapique <a.lapique@alumnos.upm.es>
* Introduction
--------------
Surfaces is a module to work with surfaces, providing GUI for tools implemented at python API, and more complex tools.

View File

@ -1,78 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
from PyQt4 import QtCore, QtGui
import FreeCAD, FreeCADGui, os
class IsoCurve:
def Activated(self):
import surfISOCurve
surfISOCurve.load()
def GetResources(self):
from surfUtils import Paths, Translator
IconPath = Paths.iconsPath() + "/IsoCurveIco.png"
MenuText = str(Translator.translate('Get ISO curve'))
ToolTip = str(Translator.translate('Get ISO curve from surface'))
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
class SliceCurve:
def Activated(self):
import surfSlice
surfSlice.load()
def GetResources(self):
from surfUtils import Paths, Translator
IconPath = Paths.iconsPath() + "/SliceIco.png"
MenuText = str(Translator.translate('Get surface slice'))
ToolTip = str(Translator.translate('Get surface intersection with coordinates planes'))
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
class Border:
def Activated(self):
import surfBorder
surfBorder.load()
def GetResources(self):
from surfUtils import Paths, Translator
IconPath = Paths.iconsPath() + "/BorderIco.png"
MenuText = str(Translator.translate('Get border'))
ToolTip = str(Translator.translate('Get edges from objects'))
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
class Convert:
def Activated(self):
import surfConvert
surfConvert.load()
def GetResources(self):
from surfUtils import Paths, Translator
IconPath = Paths.iconsPath() + "/ConvertIco.png"
MenuText = str(Translator.translate('Convert to 4 sides surface'))
ToolTip = str(Translator.translate('Convert a surface (or couple of them) into 4 sides surface'))
return {'Pixmap' : IconPath, 'MenuText': MenuText, 'ToolTip': ToolTip}
FreeCADGui.addCommand('Surf_IsoCurve', IsoCurve())
FreeCADGui.addCommand('Surf_SliceCurve', SliceCurve())
FreeCADGui.addCommand('Surf_Border', Border())
FreeCADGui.addCommand('Surf_Convert', Convert())

View File

@ -1,51 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD
import FreeCADGui
from FreeCAD import Base
from FreeCAD import Part
# Qt libraries
from PyQt4 import QtGui,QtCore
# Main object
from surfUtils import Geometry, Translator
def load():
""" Loads the tool. Getting the border don't require any
option, so can be executed directly without any task panel. """
edges = Geometry.getBorders()
if not edges:
wrn = Translator.translate("Can't get any edge from selected objects")
FreeCAD.Console.PrintWarning(wrn)
return
obj = edges[0]
for i in range(0,len(edges)):
obj = obj.oldFuse(edges[i])
Part.show(obj)
objs = FreeCAD.ActiveDocument.Objects
obj = objs[len(objs)-1]
obj.Label = 'Border'

View File

@ -1,82 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD,FreeCADGui
from FreeCAD import Base
from FreeCAD import Part
# FreeCADShip modules
from surfUtils import Paths
from surfUtils import Geometry
from surfUtils import Math
class Preview(object):
def __init__(self,U,V):
""" Constructor.
@param U Part::topoShape object that contains the U direction edge.
@param V Part::topoShape object that contains the V direction edge.
"""
self.objU = None
self.objV = None
self.U = U
self.V = V
self.buildObjs()
self.setProperties()
def buildObjs(self):
""" Builds objects to show.
"""
Part.show(self.U)
objs = FreeCAD.ActiveDocument.Objects
self.objU = objs[len(objs)-1]
Part.show(self.V)
objs = FreeCAD.ActiveDocument.Objects
self.objV = objs[len(objs)-1]
def setProperties(self):
""" Set colour of lines and width.
"""
self.objU.Label = 'U direction'
self.objV.Label = 'V direction'
# Get GUI objects instance
objU = FreeCADGui.ActiveDocument.getObject(self.objU.Name)
objV = FreeCADGui.ActiveDocument.getObject(self.objV.Name)
objU.LineColor = (0.0,0.0,1.0)
objU.LineWidth = 5.00
objV.LineColor = (1.0,0.0,0.0)
objV.LineWidth = 5.00
def clean(self,Destroy=True):
""" Erase all sections from screen.
@param self Auto call object.
@param Destroy True if the object must be destroyed, False otherwise.
"""
if (not self.objU) or (not self.objV):
return
FreeCADGui.ActiveDocument.hide(self.objU.Name)
FreeCADGui.ActiveDocument.hide(self.objV.Name)
if Destroy:
FreeCAD.ActiveDocument.removeObject(self.objU.Name)
FreeCAD.ActiveDocument.removeObject(self.objV.Name)
self.objU=None
self.objV=None

View File

@ -1,637 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# Standart libraries
import math
# Import FreeCAD modules
import FreeCAD as App
import FreeCADGui as Gui
# Import Qt libraries
from PyQt4 import QtGui,QtCore
# Import surface module utils
from surfUtils import Paths, Geometry, Math, Translator
# Import tool utils
import Preview
class TaskPanel:
def __init__(self):
""" Class constructor, that loads the user interface and set
minimum data as empty values.
"""
self.ui = Paths.modulePath() + "/surfConvert/TaskPanel.ui"
self.objs = []
self.edges = []
self.faces = []
self.surf = None
self.preview = None
def accept(self):
""" Method called when accept button is clicked.
@return True if all gone right, False otherwise.
"""
if not self.surf:
return False
App.Part.show(self.surf.toShape())
objs = App.ActiveDocument.Objects
obj = objs[len(objs)-1]
obj.Label = 'Surface'
self.preview.clean()
return True
def reject(self):
""" Method called when cancel button is clicked.
@return True if all gone right, False otherwise.
"""
if self.preview :
self.preview.clean()
return True
def clicked(self, index):
pass
def open(self):
pass
def needsFullSpace(self):
return True
def isAllowedAlterSelection(self):
return False
def isAllowedAlterView(self):
return True
def isAllowedAlterDocument(self):
return False
def helpRequested(self):
pass
def setupUi(self):
""" Setups the user interface taking and storing all controls.
"""
mw = self.getMainWindow()
form = mw.findChild(QtGui.QWidget, "TaskPanel")
form.nU = form.findChild(QtGui.QSpinBox, "nU")
form.nV = form.findChild(QtGui.QSpinBox, "nV")
form.deg = form.findChild(QtGui.QSpinBox, "deg")
self.form = form
# Initial values
if self.initValues():
return True
self.retranslateUi()
# Connect Signals and Slots
QtCore.QObject.connect(form.nU, QtCore.SIGNAL("valueChanged(int)"), self.onNUV)
QtCore.QObject.connect(form.nV, QtCore.SIGNAL("valueChanged(int)"), self.onNUV)
QtCore.QObject.connect(form.deg, QtCore.SIGNAL("valueChanged(int)"), self.onNUV)
return False
def getMainWindow(self):
""" returns the main window """
# using QtGui.qApp.activeWindow() isn't very reliable because if another
# widget than the mainwindow is active (e.g. a dialog) the wrong widget is
# returned
toplevel = QtGui.qApp.topLevelWidgets()
for i in toplevel:
if i.metaObject().className() == "Gui::MainWindow":
return i
raise Exception("No main window found")
def initValues(self):
""" Setup initial values. """
# Objects to work
self.objs = Gui.Selection.getSelection()
if not self.objs:
msg = Translator.translate("4 connected edges and at least 1 surface must be selected (Any object has been selected)")
App.Console.PrintError(msg)
return True
if len(self.objs) < 5:
msg = Translator.translate("4 connected edges and at least 1 surface must be selected (Less than 5 objects selected)")
App.Console.PrintError(msg)
return True
# Separate edge objects and face objects to work with them separately.
if self.getEdgesFaces():
return True
# Ensure that closed edges given
if not self.isClosed():
return True
# Sort edges (as connect chain)
if self.sortEdges():
return True
# First surface draft
if self.getPoints():
return True
if self.createSurface():
return True
# On screen data
self.preview = Preview.Preview(self.edges[0],self.edges[1])
msg = Translator.translate("Ready to work\n")
App.Console.PrintMessage(msg)
return False
def retranslateUi(self):
""" Set user interface locale strings.
"""
self.form.setWindowTitle(Translator.translate("Convert to 4 side surface"))
nUString = Translator.translate("Points at U")
self.form.findChild(QtGui.QLabel, "nULabel").setText("<font color=#0000ff>" + nUString + "</font>")
nVString = Translator.translate("Points at V2")
self.form.findChild(QtGui.QLabel, "nVLabel").setText("<font color=#ff0000>" + nVString + "</font>")
self.form.findChild(QtGui.QLabel, "degLabel").setText(Translator.translate("Surface degree"))
def onNUV(self, value):
""" Answer to nU points or nV points modification events.
@param value Changed value.
"""
if self.getPoints():
return
if self.createSurface():
return
self.form.deg.setMaximum(self.surf.MaxDegree)
def getEdgesFaces(self):
""" Returns two arrays filled with the edges and faces selected.
@return True if error happens. False otherwise
"""
self.edges = []
self.faces = []
for i in range(0,len(self.objs)):
objFaces = Geometry.getFaces(self.objs[i])
if not objFaces:
objEdges = Geometry.getEdges([self.objs[i]])
if not objEdges:
msg = Translator.translate("4 connected edges and at least 1 surface must be selected (Any edge found)")
App.Console.PrintError(msg)
return True
for j in range(0, len(objEdges)):
self.edges.append(objEdges[j])
else:
for j in range(0, len(objFaces)):
self.faces.append(objFaces[j])
if len(self.edges) != 4:
msg = Translator.translate("4 connected edges and at least 1 surface must be selected (More/less edges not allowed)")
App.Console.PrintError(msg)
return True
return False
def isClosed(self):
""" Returns if the edges objects are a closed curve.
@return True if a closed curve can be built with edge objects.
False otherwise
"""
edges = self.edges
for i in range(0,len(edges)):
edge = edges[i]
vertex1 = edge.Vertexes
count = [0,0]
for j in range(0,len(edges)):
if j== i:
continue
vertex2 = edges[j].Vertexes
for k in range(0,2):
if Math.isSameVertex(vertex1[0],vertex2[k]):
count[0] = count[0]+1
if Math.isSameVertex(vertex1[1],vertex2[k]):
count[1] = count[1]+1
if count != [1,1]:
msg = Translator.translate("4 Edges curve must be closed")
App.Console.PrintError(msg)
return False
return True
def sortEdges(self):
""" Sort the edges by their connection points. Also gives if
an edge is ill oriented (thir connection point is the end
point, not the starting point), with True when is good oriented,
and False otherwise.
@return True if error happens. False otherwise
"""
edges = self.edges
self.edges = [edges[0]]
self.direction = [True]
Vertex = self.edges[0].Vertexes[1]
for i in range(0,len(edges)-1):
for j in range(0,len(edges)):
if self.edges[i] == edges[j]:
continue
Vertexes = edges[j].Vertexes
if Math.isSameVertex(Vertex,Vertexes[0]):
Vertex = Vertexes[1]
self.edges.append(edges[j])
self.direction.append(True)
break
if Math.isSameVertex(Vertex,Vertexes[1]):
Vertex = Vertexes[0]
self.edges.append(edges[j])
self.direction.append(False)
break
return False
def getPoints(self):
""" Get points that will make the surface.
@return True if error happens. False otherwise.
"""
# Discretize the edges using nU,nV
if self.divideEdges():
return True
if self.samplePoints():
return True
if self.getSurfacePoints():
return True
while self.redistributePointsU():
continue
while self.redistributePointsV():
continue
return False
def divideEdges(self):
""" Get points along the edges. This method only divide the
edges into nU/nV parametrically equidistant points.
@return True if error happens. False otherwise.
"""
# Get curves from edges
curves=[]
for i in range(0,len(self.edges)):
curves.append(self.edges[i].Curve)
# Get number of divisions at U,V
nU = self.form.nU.value()
nV = self.form.nV.value()
# Get points at U direction (length parameter will used)
vertexes = self.edges[0].Vertexes
u = curves[0].parameter(App.Base.Vector(vertexes[0].X, vertexes[0].Y, vertexes[0].Z))
uEnd = curves[0].parameter(App.Base.Vector(vertexes[1].X, vertexes[1].Y, vertexes[1].Z))
du = (uEnd - u) / (nU-1.0)
Points0=[]
for i in range(0, nU):
knots = curves[0].KnotSequence
point0 = curves[0].value(u)
Points0.append(point0)
u = u + du
vertexes = self.edges[2].Vertexes
u = curves[2].parameter(App.Base.Vector(vertexes[1].X, vertexes[1].Y, vertexes[1].Z))
uEnd = curves[2].parameter(App.Base.Vector(vertexes[0].X, vertexes[0].Y, vertexes[0].Z))
du = (uEnd - u) / (nU-1.0)
Points2=[]
for i in range(0, nU):
knots = curves[2].KnotSequence
point2 = curves[2].value(u)
Points2.append(point2)
u = u + du
# Get points at V direction (length parameter will used)
vertexes = self.edges[1].Vertexes
v = curves[1].parameter(App.Base.Vector(vertexes[0].X, vertexes[0].Y, vertexes[0].Z))
vEnd = curves[1].parameter(App.Base.Vector(vertexes[1].X, vertexes[1].Y, vertexes[1].Z))
dv = (vEnd - v) / (nV-1.0)
Points1=[]
for i in range(0, nV):
knots = curves[1].KnotSequence
point1 = curves[1].value(v)
Points1.append(point1)
v = v + dv
vertexes = self.edges[3].Vertexes
v = curves[3].parameter(App.Base.Vector(vertexes[1].X, vertexes[1].Y, vertexes[1].Z))
vEnd = curves[3].parameter(App.Base.Vector(vertexes[0].X, vertexes[0].Y, vertexes[0].Z))
dv = (vEnd - v) / (nV-1.0)
Points3=[]
for i in range(0, nV):
knots = curves[3].KnotSequence
point3 = curves[3].value(v)
Points3.append(point3)
v = v + dv
# Store points arrays
self.EdgePoints=[Points0,Points1,Points2,Points3]
# Ensure that is good oriented
for i in range(0,4):
if not self.direction[i]:
self.EdgePoints[i].reverse()
return False
def samplePoints(self):
""" Builds a set of points between the edges points. The points
are a smooth interpolation between edges points in order to
project it over the surface.
@return True if error happens. False otherwise.
"""
# We will advance in V direction, getting point columns, so two
# points columns are knowed from U starting and end curves
startU = self.EdgePoints[0]
endU = self.EdgePoints[2]
endV = self.EdgePoints[1]
startV = self.EdgePoints[3]
self.sample = [startU]
# Take two guides from the starting and end U curves. All
# sample points will be interpolated with this guides
Guide0 = startU[len(startU)-1] - startU[0]
Length0 = Guide0.Length
Guide0.normalize()
Guide1 = endU[len(endU)-1] - endU[0]
Length1 = Guide1.Length
Guide1.normalize()
# Loop over columns
for i in range(1,len(startV)-1):
# Get the guide
Guide = endV[i] - startV[i]
Length = Guide.Length
Guide.normalize()
# Loop over points of the column
points = []
points.append(startV[i])
for j in range(1,len(startU)-1):
# Get deviation at starting U
v0 = (startU[j] - startU[0]).multiply(1.0 / Length0) - Guide0
# Get deviation at ending U
v1 = (endU[j] - endU[0]).multiply(1.0 / Length1) - Guide1
# Get factor
factor = float(i) / len(startV)
# Interpolate
v = (v0.multiply(1.0-factor) + v1.multiply(factor) + Guide).multiply(Length)
points.append(startV[i]+v)
points.append(endV[i])
self.sample.append(points)
# Append last points column (end U curve)
self.sample.append(endU)
return False
def getSurfacePoints(self):
""" Get the points of the surface. Here sample points will be
projected into the surface, getting another surface with nU,nV
knots.
@todo Support trimmed surfaces.
@return True if error happens. False otherwise.
"""
surf = self.faces[0].Surface
self.uv=[]
self.points=[]
self.surfacesID=[]
for j in range(0,len(self.sample)):
points=[]
uv=[]
surfacesID=[]
for k in range(0,len(self.sample[j])):
UV = surf.parameter(self.sample[j][k])
umax = surf.UKnotSequence[len(surf.UKnotSequence)-1]
umin = surf.UKnotSequence[0]
vmax = surf.VKnotSequence[len(surf.VKnotSequence)-1]
vmin = surf.VKnotSequence[0]
uv.append([UV[0],UV[1]])
uv[k][0] = max(min(uv[k][0],umax), umin)
uv[k][1] = max(min(uv[k][1],vmax), vmin)
point = surf.value(uv[k][0], uv[k][1])
points.append(point)
surfacesID.append(0)
self.uv.append(uv)
self.points.append(points)
self.surfacesID.append(surfacesID)
for i in range(1,len(self.faces)):
surf = self.faces[i].Surface
for j in range(0,len(self.sample)):
for k in range(0,len(self.sample[j])):
UV = surf.parameter(self.sample[j][k])
uv = [UV[0],UV[1]]
UV = uv[:]
umax = surf.UKnotSequence[len(surf.UKnotSequence)-1]
umin = surf.UKnotSequence[0]
vmax = surf.VKnotSequence[len(surf.VKnotSequence)-1]
vmin = surf.VKnotSequence[0]
UV[0] = uv[0]/(surf.UKnotSequence[len(surf.UKnotSequence)-1])
UV[1] = uv[1]/(surf.VKnotSequence[len(surf.VKnotSequence)-1])
ru=abs(UV[0]-0.5)
rv=abs(UV[1]-0.5)
surf2 = self.faces[self.surfacesID[j][k]].Surface
UV2 = surf2.parameter(self.sample[j][k])
uv2 = [UV2[0],UV2[1]]
UV2 = uv2[:]
umax2 = surf2.UKnotSequence[len(surf2.UKnotSequence)-1]
umin2 = surf2.UKnotSequence[0]
vmax2 = surf2.VKnotSequence[len(surf2.VKnotSequence)-1]
vmin2 = surf2.VKnotSequence[0]
UV2[0] = uv2[0]/(surf2.UKnotSequence[len(surf2.UKnotSequence)-1])
UV2[1] = uv2[1]/(surf2.VKnotSequence[len(surf2.VKnotSequence)-1])
ru2=abs(UV2[0]-0.5)
rv2=abs(UV2[1]-0.5)
point=surf.value(UV[0],UV[1])
point2=surf2.value(UV2[0],UV2[1])
dif= math.sqrt((point[0]-self.sample[j][k][0])**2+(point[1]-self.sample[j][k][1])**2+(point[2]-self.sample[j][k][2])**2)
dif2= math.sqrt((point2[0]-self.sample[j][k][0])**2+(point2[1]-self.sample[j][k][1])**2+(point2[2]-self.sample[j][k][2])**2)
nU = len(self.points)
nV = len(self.points[j])
deltaU = 1/(2*nU)
deltaV = 1/(2*nV)
if ((ru < deltaU) and (rv < deltaV)):
uv[0] = max(min(uv[0],umax), umin)
uv[1] = max(min(uv[1],vmax), vmin)
self.uv[j][k]=uv
point = surf.value(uv[0], uv[1])
self.points[j][k]=point
self.surfacesID[j][k] = i
elif (dif2 > dif):
uv[0] = max(min(uv[0],umax), umin)
uv[1] = max(min(uv[1],vmax), vmin)
self.uv[j][k]=uv
point = surf.value(uv[0], uv[1])
self.points[j][k]=point
self.surfacesID[j][k] = i
return False
def redistributePointsU(self):
""" Redistributes the points of the surface (U direction).
@return False if all points are right placed. True otherwise.
"""
#Redistribute columns
for i in range(0,len(self.points)):
sumdif=0.0
difs=[]
# Compute distances between points
for j in range(1,len(self.points[i])):
vdif=self.points[i][j]-self.points[i][j-1]
dif=vdif.Length
sumdif=sumdif+dif
difs.append(dif)
# Loop over point distances
for k in range(0,len(difs)):
# If not the same surface for each point, UV
# redistribution is not valid, so 3D points must be
# edited (more effort and worst convergency).
if self.surfacesID[i][k] != self.surfacesID[i][k+1]:
if difs[k]>=(2*sumdif/len(difs)):
point1 = App.Base.Vector(0.0,0.0,0.0)
point1.x = self.points[i][k][0]+0.33*(self.points[i][k+1][0]-self.points[i][k][0])
point1.y = self.points[i][k][1]+0.33*(self.points[i][k+1][1]-self.points[i][k][1])
point1.z = self.points[i][k][2]+0.33*(self.points[i][k+1][2]-self.points[i][k][2])
point2 = App.Base.Vector(0.0,0.0,0.0)
point2.x = self.points[i][k+1][0]-0.33*(self.points[i][k+1][0]-self.points[i][k][0])
point2.y = self.points[i][k+1][1]-0.33*(self.points[i][k+1][1]-self.points[i][k][1])
point2.z = self.points[i][k+1][2]-0.33*(self.points[i][k+1][2]-self.points[i][k][2])
moved = False
if(k != 0):
self.points[i][k] = point1
surf1 = self.faces[self.surfacesID[i][k]].Surface
uv = surf1.parameter(self.points[i][k])
self.uv[i][k] = [uv[0], uv[1]]
self.points[i][k]=surf1.value(self.uv[i][k][0],self.uv[i][k][1])
moved = True
if(k+1 != len(self.points[i])-1):
self.points[i][k+1] = point2
surf2 = self.faces[self.surfacesID[i][k+1]].Surface
uv = surf2.parameter(self.points[i][k+1])
self.uv[i][k+1] = [uv[0], uv[1]]
self.points[i][k+1]=surf2.value(self.uv[i][k+1][0],self.uv[i][k+1][1])
moved = True
if moved:
return True
continue
# If same surface for each point, UV
# redistribution is possible, with better convergency
# and less computation effort.
if difs[k]>=(2*sumdif/len(difs)):
uv1 = [0.0,0.0]
uv1[0] = self.uv[i][k][0]+0.33*(self.uv[i][k+1][0]-self.uv[i][k][0])
uv1[1] = self.uv[i][k][1]+0.33*(self.uv[i][k+1][1]-self.uv[i][k][1])
uv2 = [0.0,0.0]
uv2[0] = self.uv[i][k+1][0]-0.33*(self.uv[i][k+1][0]-self.uv[i][k][0])
uv2[1] = self.uv[i][k+1][1]-0.33*(self.uv[i][k+1][1]-self.uv[i][k][1])
moved = False
if(k != 0):
self.uv[i][k] = uv1[:]
surf = self.faces[self.surfacesID[i][k]].Surface
self.points[i][k] = surf.value(self.uv[i][k][0], self.uv[i][k][1])
moved = True
if(k+1 != len(self.points[i])-1):
self.uv[i][k+1] = uv2[:]
surf = self.faces[self.surfacesID[i][k+1]].Surface
self.points[i][k+1] = surf.value(self.uv[i][k+1][0], self.uv[i][k+1][1])
if moved:
return True
return False
def redistributePointsV(self):
""" Redistributes the points of the surface (V direction).
@return False if all points are right placed. True otherwise.
"""
#Redistribute rows
for i in range(0,len(self.points[0])):
sumdif=0
difs=[]
# Compute distances between points
for j in range(1,len(self.points)):
vdif=self.points[j][i]-self.points[j-1][i]
dif=vdif.Length
sumdif=sumdif+dif
difs.append(dif)
# Loop over point distances
for k in range(0,len(difs)):
# If not the same surface for each point, UV
# redistribution is not valid, so 3D points must be
# edited (more effort and worst convergency).
if self.surfacesID[k][i] != self.surfacesID[k+1][i]:
if difs[k]>=(2*sumdif/len(difs)):
point1 = App.Base.Vector(0.0,0.0,0.0)
point1.x = self.points[k][i][0]+0.33*(self.points[k+1][i][0]-self.points[k][i][0])
point1.y = self.points[k][i][1]+0.33*(self.points[k+1][i][1]-self.points[k][i][1])
point1.z = self.points[k][i][2]+0.33*(self.points[k+1][i][2]-self.points[k][i][2])
point2 = App.Base.Vector(0.0,0.0,0.0)
point2.x = self.points[k+1][i][0]-0.33*(self.points[k+1][i][0]-self.points[k][i][0])
point2.y = self.points[k+1][i][1]-0.33*(self.points[k+1][i][1]-self.points[k][i][1])
point2.z = self.points[k+1][i][2]-0.33*(self.points[k+1][i][2]-self.points[k][i][2])
moved = False
if(k != 0):
self.points[k][i] = point1
surf1 = self.faces[self.surfacesID[k][i]].Surface
uv = surf1.parameter(self.points[k][i])
self.uv[k][i] = [uv[0], uv[1]]
self.points[k][i]=surf1.value(self.uv[k][i][0],self.uv[k][i][1])
moved = True
if(k+1 != len(self.points)-1):
self.points[k+1][i] = point2
surf2 = self.faces[self.surfacesID[k+1][i]].Surface
uv = surf2.parameter(self.points[k+1][i])
self.uv[k+1][i] = [uv[0], uv[1]]
self.points[k+1][i]=surf2.value(self.uv[k+1][i][0],self.uv[k+1][i][1])
moved = True
if moved:
return True
continue
# If same surface for each point, UV
# redistribution is possible, with better convergency
# and less computation effort.
if difs[k]>=(2*sumdif/len(difs)):
uv1 = [0.0,0.0]
uv1[0] = self.uv[k][i][0]+0.33*(self.uv[k+1][i][0]-self.uv[k][i][0])
uv1[1] = self.uv[k][i][1]+0.33*(self.uv[k+1][i][1]-self.uv[k][i][1])
uv2 = [0.0,0.0]
uv2[0] = self.uv[k+1][i][0]-0.33*(self.uv[k+1][i][0]-self.uv[k][i][0])
uv2[1] = self.uv[k+1][i][1]-0.33*(self.uv[k+1][i][1]-self.uv[k][i][1])
moved = False
if(k != 0):
self.uv[i][k] = uv1[:]
surf = self.faces[self.surfacesID[k][i]].Surface
self.points[k][i] = surf.value(self.uv[k][i][0], self.uv[k][i][1])
moved = True
if(k+1 != len(self.points[i])-1):
self.uv[i][k+1] = uv2[:]
surf = self.faces[self.surfacesID[k+1][i]].Surface
self.points[k+1][i] = surf.value(self.uv[k+1][i][0], self.uv[k+1][i][1])
if moved:
return True
return False
def createSurface(self):
""" Generates the BSpline surface.
@return False if all gone right. True otherwise.
"""
# Create a (1 x 1) plane with (nU x nV) knots
self.surf = App.Part.BSplineSurface()
nU = len(self.points)
nV = len(self.points[0])
for i in range(1,nU-1):
u = i / float(nU-1)
self.surf.insertUKnot(u,i,0.000001)
for i in range(1,nV-1):
v = i / float(nV-1)
self.surf.insertVKnot(v,i,0.000001)
# Reposition points of surface
for i in range(0,nU):
for j in range(0,nV):
u = i / float(nU-1)
v = j / float(nV-1)
point = self.points[i][j]
self.surf.movePoint(u,v,point,i+1,i+1,j+1,j+1)
# Reaconditionate surface
self.surf.exchangeUV()
deg = self.form.deg.value()
if (deg > 1) and (deg < self.surf.MaxDegree):
self.surf.increaseDegree(deg,deg)
return False
def createTask():
""" Create a task panel.
@return Task panel.
"""
panel = TaskPanel()
Gui.Control.showDialog(panel)
if panel.setupUi():
Gui.Control.closeDialog(panel)
return None
return panel

View File

@ -1,107 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TaskPanel</class>
<widget class="QWidget" name="TaskPanel">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>307</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
<string>Convert surface</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="nULabel">
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600; color:#0000ff;&quot;&gt;Points at U&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="nU">
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="nVLabel">
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0000;&quot;&gt;Points at V&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="nV">
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="degLabel">
<property name="text">
<string>Surface degree</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="deg">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>25</number>
</property>
<property name="value">
<number>3</number>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>15</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,37 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD
import FreeCADGui
# Qt libraries
from PyQt4 import QtGui,QtCore
# Main object
import TaskPanel
from surfUtils import Paths
def load():
""" Loads the tool """
TaskPanel.createTask()

View File

@ -1,88 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD as App
import FreeCADGui as Gui
import Draft
from FreeCAD import Vector
# Qt library
from PyQt4 import QtGui,QtCore
# Pivy
import pivy
from pivy import coin
from pivy.coin import *
# Module
from surfUtils import Paths
from surfUtils import Geometry
from surfISOCurve import Preview
class PointTracker:
def __init__(self,view,task):
self.view=view
self.task=task
task.tracker = self
self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.mouseButton)
self.callbackMove = self.view.addEventCallbackPivy(SoLocation2Event.getClassTypeId(),self.mouseMove)
def mouseMove(self, event_cb):
event = event_cb.getEvent()
surf = self.task.surf
if not surf:
return
# Get screen point
screen = event.getPosition()
ctrl = event.wasCtrlDown()
# Get snapped object if exist, else the screen point will used
point = Gui.Snapper.snap(screen, ctrl)
def mouseButton(self, event_cb):
event = event_cb.getEvent()
if event.getState() != coin.SoMouseButtonEvent.DOWN:
return
surf = self.task.surf
if not surf:
return
# Get screen point
screen = event.getPosition()
ctrl = event.wasCtrlDown()
# Get snapped object if exist, else the screen point will used
point = Gui.Snapper.snap(screen, ctrl)
if not point:
point = self.view.getPoint(screen[0],screen[1])
# Get the nearest surface point parameter
uv = surf.parameter(point)
uv = [uv[0], uv[1]]
uv[0] = uv[0] / surf.UKnotSequence[len(surf.UKnotSequence)-1]
uv[0] = max(0, min(uv[0], 1))
uv[1] = uv[1] / surf.VKnotSequence[len(surf.VKnotSequence)-1]
uv[1] = max(0, min(uv[1], 1))
# Set it into the task panel
self.task.setUV(uv[self.task.dirId])
def close(self):
# Switch off snapping
Gui.Snapper.off()
# Remove callback (Program crash otherwise)
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callback)
self.view.removeEventCallbackPivy(SoLocation2Event.getClassTypeId(),self.callbackMove)

View File

@ -1,125 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD,FreeCADGui
from FreeCAD import Base
from FreeCAD import Part
# FreeCADShip modules
from surfUtils import Paths
from surfUtils import Geometry
from surfUtils import Math
class Preview(object):
def __init__(self):
""" Constructor.
@param self Auto call object.
@note Start it as unactive
"""
self.obj = None
self.reinit()
def reinit(self):
""" Reinitializate drawer.
@param self Auto call object.
"""
self.clean()
self.obj = None
def update(self, surf, direction, uv):
""" Update the 3D view printing curve.
@param self Auto call object.
@param surf Surf where get the curve.
@param direction 0 if u direction, 1 if v.
@param uv Curve uv index, between 0 and 1.
@return Curve from object (as Part::Feature).
"""
# Errors
if not surf:
return None
# Get curve
if direction == 0:
curve = self.getU(surf, uv)
elif direction == 1:
curve = self.getV(surf, uv)
else:
return None
# Draw at 3D view
self.clean()
Part.show(curve.toShape())
objs = FreeCAD.ActiveDocument.Objects
self.obj = objs[len(objs)-1]
self.obj.Label = 'surfISOCurve'
return self.obj
def getU(self, surf, uv):
""" Get U curve from object.
@param self Auto call object.
@param surf Surf where get the curve.
@param uv Curve uv index, between 0 and 1.
@return Curve from object.
"""
# Errors
if not surf:
return None
if (uv < 0.0) or (uv > 1.0):
return None
# Get UV data
knots = surf.UKnotSequence
id0 = knots[0]
id1 = knots[len(knots)-1]
# Get curve
curve = surf.uIso(id0 + uv*(id1-id0))
return curve
def getV(self, surf, uv):
""" Get U curve from object.
@param self Auto call object.
@param surf Surf where get the curve.
@param uv Curve uv index, between 0 and 1.
@return Curve from object.
"""
# Errors
if not surf:
return None
if (uv < 0.0) or (uv > 1.0):
return None
# Get UV data
knots = surf.VKnotSequence
id0 = knots[0]
id1 = knots[len(knots)-1]
# Get curve
curve = surf.vIso(id0 + uv*(id1-id0))
return curve
def clean(self,Destroy=True):
""" Erase all sections from screen.
@param self Auto call object.
@param Destroy True if the object must be destroyed, False otherwise.
"""
if not self.obj:
return
FreeCADGui.ActiveDocument.hide(self.obj.Name)
if Destroy:
FreeCAD.ActiveDocument.removeObject(self.obj.Name)
self.obj=None

View File

@ -1,168 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD as App
import FreeCADGui as Gui
# Qt library
from PyQt4 import QtGui,QtCore
# Module
from surfUtils import Paths, Geometry, Math, Translator
import Preview
import PointTracker
class TaskPanel:
def __init__(self):
self.ui = Paths.modulePath() + "/surfISOCurve/TaskPanel.ui"
self.preview = Preview.Preview()
self.tracker = None
def accept(self):
if not self.obj:
return True
self.obj.Label = 'ISOCurve'
self.close()
return True
def reject(self):
self.preview.clean()
self.close()
return True
def clicked(self, index):
pass
def open(self):
pass
def needsFullSpace(self):
return True
def isAllowedAlterSelection(self):
return False
def isAllowedAlterView(self):
return True
def isAllowedAlterDocument(self):
return False
def helpRequested(self):
pass
def setupUi(self):
mw = self.getMainWindow()
form = mw.findChild(QtGui.QWidget, "TaskPanel")
form.direction = form.findChild(QtGui.QComboBox, "direction")
form.uv = form.findChild(QtGui.QSlider, "uv")
form.uvText = form.findChild(QtGui.QDoubleSpinBox, "uvText")
self.form = form
# Initial values
if self.initValues():
return True
self.obj = self.preview.update(self.surf, self.dirId, self.uv)
self.retranslateUi()
# Connect Signals and Slots
QtCore.QObject.connect(form.direction, QtCore.SIGNAL("activated(QString)"), self.selectDirection)
QtCore.QObject.connect(form.uv, QtCore.SIGNAL("valueChanged(int)"), self.onUVSlider)
QtCore.QObject.connect(form.uvText, QtCore.SIGNAL("valueChanged(double)"), self.onUVText)
def getMainWindow(self):
"returns the main window"
# using QtGui.qApp.activeWindow() isn't very reliable because if another
# widget than the mainwindow is active (e.g. a dialog) the wrong widget is
# returned
toplevel = QtGui.qApp.topLevelWidgets()
for i in toplevel:
if i.metaObject().className() == "Gui::MainWindow":
return i
raise Exception("No main window found")
def selectDirection(self):
self.dirId = self.form.direction.currentIndex()
self.obj = self.preview.update(self.surf, self.dirId, self.uv)
if not self.obj:
msg = Translator.translate("Can't get the curve from selected object")
App.Console.PrintWarning(msg)
def onUVSlider(self, value):
uv = self.form.uv.value()
uv = uv/(float(self.form.uv.maximum()))
self.setUV(uv)
def onUVText(self, value):
uv = self.form.uvText.value()
self.setUV(uv)
def setUV(self, uv):
self.form.uv.setValue(uv*self.form.uv.maximum())
self.form.uvText.setValue(uv)
self.uv = uv
if not self.surf:
return
self.obj = self.preview.update(self.surf, self.dirId, self.uv)
if not self.obj:
msg = Translator.translate("Can't get the curve from selected object")
App.Console.PrintWarning(msg)
def initValues(self):
self.obj = None
self.dirId = 0
self.uv = 0
self.surf = None
self.selObj = Geometry.getSelectedObj()
if not self.selObj:
msg = Translator.translate("1 surface must be selected (Any object has been selected)")
App.Console.PrintError(msg)
return True
self.surf = Geometry.getSelectedSurface()
if not self.surf:
msg = Translator.translate("1 surface must be selected (Any face object found into selected objects)")
App.Console.PrintError(msg)
return True
msg = Translator.translate("Ready to work")
App.Console.PrintMessage(msg)
return False
def retranslateUi(self):
""" Set user interface locale strings.
"""
self.form.setWindowTitle(Translator.translate("Get surface ISO curve"))
self.form.direction.setItemText(0, Translator.translate("U direction"))
self.form.direction.setItemText(1, Translator.translate("V direction"))
def close(self):
""" Destroy all dependant objects
@param self Main object.
"""
if self.tracker:
self.tracker.close()
def createTask():
panel = TaskPanel()
Gui.Control.showDialog(panel)
if panel.setupUi():
Gui.Control.closeDialog(panel)
return None
tracker = PointTracker.PointTracker(Gui.ActiveDocument.ActiveView, panel)
return panel

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TaskPanel</class>
<widget class="QWidget" name="TaskPanel">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>307</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
<string>Get ISO curve from surface</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QComboBox" name="direction">
<item>
<property name="text">
<string>U direction</string>
</property>
</item>
<item>
<property name="text">
<string>V direction</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QSlider" name="uv">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QDoubleSpinBox" name="uvText">
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,37 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD
import FreeCADGui
# Qt libraries
from PyQt4 import QtGui,QtCore
# Main object
import TaskPanel
from surfUtils import Paths
def load():
""" Loads the tool """
TaskPanel.createTask()

View File

@ -1,71 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD as App
import FreeCADGui as Gui
import Draft
from FreeCAD import Vector
# Qt library
from PyQt4 import QtGui,QtCore
# Pivy
import pivy
from pivy import coin
from pivy.coin import *
# Module
from surfUtils import Paths
from surfUtils import Geometry
from surfSlice import Preview
class PointTracker:
def __init__(self,view,task):
self.view=view
self.task=task
task.tracker = self
self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.mouseButton)
self.callbackMove = self.view.addEventCallbackPivy(SoLocation2Event.getClassTypeId(),self.mouseMove)
def mouseMove(self, event_cb):
event = event_cb.getEvent()
# Get screen point
screen = event.getPosition()
ctrl = event.wasCtrlDown()
# Get snapped object if exist, else the screen point will used
point = Gui.Snapper.snap(screen, ctrl)
def mouseButton(self, event_cb):
event = event_cb.getEvent()
if event.getState() != coin.SoMouseButtonEvent.DOWN:
return
# Get screen point
screen = event.getPosition()
ctrl = event.wasCtrlDown()
# Get snapped object if exist, else the screen point will used
point = Gui.Snapper.snap(screen, ctrl)
if not point:
point = self.view.getPoint(screen[0],screen[1])
# Set it into the task panel
self.task.setR3(point)
def close(self):
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callback)

View File

@ -1,100 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD,FreeCADGui
from FreeCAD import Base
from FreeCAD import Part
# FreeCADShip modules
from surfUtils import Paths
from surfUtils import Geometry
from surfUtils import Math
class Preview(object):
def __init__(self):
""" Constructor.
@param self Auto call object.
@note Start it as unactive
"""
self.objs = None
self.reinit()
def reinit(self):
""" Reinitializate drawer.
@param self Auto call object.
"""
self.clean()
self.objs = None
def update(self, surf, direction, r):
""" Update the 3D view printing curve.
@param surf Surf where get the curve.
@param direction Slice plane normal vector.
@param r Absolute position at Slice plane normal direction.
@return Curve from object (as Part::Feature).
"""
# Errors
if not surf:
return None
# Get curve
curve = self.getSlice(surf, direction, r)
# Draw at 3D view
self.clean()
self.objs = []
for i in range(0,len(curve)):
for j in range(0,len(curve[i])):
Part.show(curve[i][j])
objs = FreeCAD.ActiveDocument.Objects
objs[len(objs)-1].Label = 'surfSliceCurve'
self.objs.append(objs[len(objs)-1])
return self.objs
def getSlice(self, surf, direction, r):
""" Get surface slice.
@param surf Surf where get the curve.
@param direction Slice plane normal vector.
@param r Absolute position at Slice plane normal direction.
@return Curve from object.
"""
# Errors
if not surf:
return None
# Get curve
curve = []
for i in range(0,len(surf)):
curve.append(surf[i].slice(direction, r))
return curve
def clean(self,Destroy=True):
""" Erase all sections from screen.
@param self Auto call object.
@param Destroy True if the object must be destroyed, False otherwise.
"""
if not self.objs:
return
for i in range(0,len(self.objs)):
FreeCADGui.ActiveDocument.hide(self.objs[i].Name)
if Destroy:
FreeCAD.ActiveDocument.removeObject(self.objs[i].Name)
if Destroy:
self.objs=None

View File

@ -1,217 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD as App
import FreeCADGui as Gui
from FreeCAD import Vector
# Qt library
from PyQt4 import QtGui,QtCore
# Module
from surfUtils import Paths, Geometry, Math, Translator
import Preview
import PointTracker
class TaskPanel:
def __init__(self):
self.ui = Paths.modulePath() + "/surfSlice/TaskPanel.ui"
self.preview = Preview.Preview()
self.tracker = None
self.dir = Vector(0.0,0.0,1.0)
def accept(self):
if not self.objs:
return True
for i in range(0,len(self.objs)):
self.objs[i].Label = 'SliceCurve'
self.close()
return True
def reject(self):
self.preview.clean()
self.close()
return True
def clicked(self, index):
pass
def open(self):
pass
def needsFullSpace(self):
return True
def isAllowedAlterSelection(self):
return False
def isAllowedAlterView(self):
return True
def isAllowedAlterDocument(self):
return False
def helpRequested(self):
pass
def setupUi(self):
mw = self.getMainWindow()
form = mw.findChild(QtGui.QWidget, "TaskPanel")
form.direction = form.findChild(QtGui.QComboBox, "direction")
form.r = form.findChild(QtGui.QSlider, "r")
form.rText = form.findChild(QtGui.QDoubleSpinBox, "rText")
self.form = form
# Initial values
if self.initValues():
return True
self.retranslateUi()
self.form.rText.setMinimum(self.bound[4])
self.form.rText.setMaximum(self.bound[5])
self.setR(self.r)
# Connect Signals and Slots
QtCore.QObject.connect(form.direction, QtCore.SIGNAL("activated(QString)"), self.selectDirection)
QtCore.QObject.connect(form.r, QtCore.SIGNAL("valueChanged(int)"), self.onRSlider)
QtCore.QObject.connect(form.rText, QtCore.SIGNAL("valueChanged(double)"), self.onRText)
return False
def getMainWindow(self):
"returns the main window"
# using QtGui.qApp.activeWindow() isn't very reliable because if another
# widget than the mainwindow is active (i.e. a dialog) the wrong widget is
# returned
toplevel = QtGui.qApp.topLevelWidgets()
for i in toplevel:
if i.metaObject().className() == "Gui::MainWindow":
return i
raise Exception("No main window found")
def selectDirection(self):
if(self.form.direction.currentIndex() == 0): # XY
self.dir = Vector(0.0,0.0,1.0)
self.r = max(self.r, self.bound[4])
self.r = min(self.r, self.bound[5])
self.form.rText.setMinimum(self.bound[4])
self.form.rText.setMaximum(self.bound[5])
if(self.form.direction.currentIndex() == 1): # XZ
self.dir = Vector(0.0,1.0,0.0)
self.r = max(self.r, self.bound[2])
self.r = min(self.r, self.bound[3])
self.form.rText.setMinimum(self.bound[2])
self.form.rText.setMaximum(self.bound[3])
if(self.form.direction.currentIndex() == 2): # YZ
self.dir = Vector(1.0,0.0,0.0)
self.r = max(self.r, self.bound[0])
self.r = min(self.r, self.bound[1])
self.form.rText.setMinimum(self.bound[0])
self.form.rText.setMaximum(self.bound[1])
self.objs = self.preview.update(self.face, self.dir, self.r)
if not self.objs:
msg = Translator.translate("Can't calculate section")
App.Console.PrintWarning(msg)
def onRSlider(self, value):
# Get r at [0,1] interval
r = self.form.r.value()
r = r/(float(self.form.r.maximum()))
# Expand to real interval
dr = self.form.rText.maximum()-self.form.rText.minimum()
r = r*dr + self.form.rText.minimum()
# Set value
self.setR(r)
def onRText(self, value):
r = self.form.rText.value()
self.setR(r)
def setR(self, r):
self.form.rText.setValue(r)
self.r = max(self.form.rText.minimum(), min(self.form.rText.maximum(), r))
dr = self.form.rText.maximum()-self.form.rText.minimum()
r = (r - self.form.rText.minimum())/dr*self.form.r.maximum()
self.form.r.setValue(r)
if not self.face:
return
self.objs = self.preview.update(self.face, self.dir, self.r)
if not self.objs:
msg = Translator.translate("Can't calculate section")
App.Console.PrintWarning(msg)
def setR3(self, r):
if(self.form.direction.currentIndex() == 0): # XY
self.setR(r.z)
if(self.form.direction.currentIndex() == 1): # XZ
self.setR(r.y)
if(self.form.direction.currentIndex() == 2): # YZ
self.setR(r.x)
def initValues(self):
self.objs = None
self.dir = Vector(0.0,0.0,1.0)
self.r = 0.0
self.face = None
self.selObj = Geometry.getSelectedObj()
if not self.selObj:
msg = Translator.translate("At least 1 surface must be selected (Any selected object)")
App.Console.PrintError(msg)
return True
self.face = Geometry.getFaces()
if not self.face:
msg = Translator.translate("At least 1 surface must be selected (Any face object found into selected objects)")
App.Console.PrintError(msg)
return True
bound = self.face[0].BoundBox
self.bound = [bound.XMin, bound.XMax, bound.YMin, bound.YMax, bound.ZMin, bound.ZMax]
for i in range(1,len(self.face)):
face = self.face[i]
bound = face.BoundBox
self.bound[0] = min(self.bound[0],bound.XMin)
self.bound[1] = min(self.bound[1],bound.XMax)
self.bound[2] = min(self.bound[2],bound.YMin)
self.bound[3] = min(self.bound[3],bound.YMax)
self.bound[4] = min(self.bound[4],bound.ZMin)
self.bound[5] = min(self.bound[5],bound.ZMax)
self.r = max(self.r, self.bound[4])
self.r = min(self.r, self.bound[5])
msg = Translator.translate("Ready to work")
App.Console.PrintMessage(msg)
return False
def retranslateUi(self):
""" Set user interface locale strings.
"""
self.form.setWindowTitle(Translator.translate("Get surface slice"))
def close(self):
""" Destroy all dependant objects
@param self Main object.
"""
if self.tracker:
self.tracker.close()
def createTask():
panel = TaskPanel()
Gui.Control.showDialog(panel)
if panel.setupUi():
Gui.Control.closeDialog(panel)
return None
tracker = PointTracker.PointTracker(Gui.ActiveDocument.ActiveView, panel)
return panel

View File

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TaskPanel</class>
<widget class="QWidget" name="TaskPanel">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>307</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
<string>Get surface slice</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QComboBox" name="direction">
<item>
<property name="text">
<string>XY</string>
</property>
</item>
<item>
<property name="text">
<string>XZ</string>
</property>
</item>
<item>
<property name="text">
<string>YZ</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QSlider" name="r">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QDoubleSpinBox" name="rText">
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,37 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# FreeCAD modules
import FreeCAD
import FreeCADGui
# Qt libraries
from PyQt4 import QtGui,QtCore
# Main object
import TaskPanel
from surfUtils import Paths
def load():
""" Loads the tool """
TaskPanel.createTask()

View File

@ -1,175 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import math
# FreeCAD
import FreeCAD, FreeCADGui
from FreeCAD import Base
#from FreeCAD import Part
import Part
# FreeCAD ship
from surfUtils import Math
def getSelectedObjs():
""" Returns the selected objects list
@return Selected objects list
"""
return FreeCADGui.Selection.getSelection()
def getSelectedObj():
""" Returns the first element of the selected objects list
@return Selected object. None if errors happens
"""
objs = FreeCADGui.Selection.getSelection()
if not objs:
return None
if not len(objs):
return None
obj = objs[0]
return FreeCAD.ActiveDocument.getObject(obj.Name)
def getEdges(objs=None):
""" Returns object edges (list of them)
@param objs Object to get the faces, none if selected
object may used.
@return Selected edges. None if errors happens
"""
edges = []
if not objs:
objs = FreeCADGui.Selection.getSelection()
if not objs:
return None
for i in range(0, len(objs)):
obj = objs[i]
if obj.isDerivedFrom('Part::Feature'):
# get shape
shape = obj.Shape
if not shape:
return None
obj = shape
if not obj.isDerivedFrom('Part::TopoShape'):
return None
objEdges = obj.Edges
if not objEdges:
continue
for j in range(0, len(objEdges)):
edges.append(objEdges[j])
return edges
def getFaces(obj=None):
""" Returns object faces (list of them)
@param obj Object to get the faces, none if selected
object may used.
@return Selected faces. None if errors happens
"""
if not obj:
obj = getSelectedObj()
if not obj:
return None
if obj.isDerivedFrom('Part::Feature'):
# get shape
shape = obj.Shape
if not shape:
return None
obj = shape
if not obj.isDerivedFrom('Part::TopoShape'):
return None
# get face
faces = obj.Faces
if not faces:
return None
if not len(faces):
return None
return faces
def getSelectedSurface(obj=None):
""" Returns object surface (the first of the list)
@param obj Object to get the surface, none if selected
object may used.
@return Selected surface. None if errors happens
"""
faces = getFaces(obj)
if not faces:
return None
obj = faces[0]
# get surface
surf = obj.Surface
if not surf:
return None
return surf
def getBorders(objs=None):
""" Returns the borders of all selected objects as edge array
@param objs Objects to get the edges, none if selected objects
may used.
@return Borders
"""
edges = []
if not objs:
objs = FreeCADGui.Selection.getSelection()
if not objs:
return None
if len(objs) < 1:
return None
for i in range(0, len(objs)):
faces = getFaces(objs[i])
if not faces:
continue
for j in range(0, len(faces)):
edgList = faces[j].Edges
for k in range(0, len(edgList)):
edges.append(edgList[k])
return edges
def lineFaceSection(line,surface):
""" Returns the point of section of a line with a face
@param line Line object, that can be a curve.
@param surface Surface object (must be a Part::Shape)
@return Section points array, [] if line don't cut surface
"""
# Get initial data
result = []
vertexes = line.Vertexes
nVertex = len(vertexes)
# Perform the cut
section = line.cut(surface)
# Filter all old points
points = section.Vertexes
nPoint = len(points)
if nPoint <= nVertex:
# Any valid point
result
for i in range(0,nPoint):
disp = len(result)
flag = 0
if not Math.isAprox(points[i].X,vertexes[i-disp].X,0.0001):
flag = flag+1
if not Math.isAprox(points[i].Y,vertexes[i-disp].Y,0.0001):
flag = flag+1
if not Math.isAprox(points[i].Z,vertexes[i-disp].Z,0.0001):
flag = flag+1
if flag > 0:
result.append(points[i])
return result

View File

@ -1,57 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
def isAprox(a,b,tol=0.0001):
"""returns if a value is into (b-tol,b+tol)
@param a Value to compare.
@param b Center of valid interval
@param tol Radius of valid interval
@return True if a is into (b-tol,b+tol), False otherwise
"""
if (a < b+abs(tol)) and (a > b-abs(tol)):
return True
return False
def isSamePoint(a,b,tol=0.0001):
"""returns if two points are the same with a provided tolerance
@param a Point to compare.
@param b Reference point.
@param tol Radius of valid interval
@return True if twice point are the same, False otherwise
@note FreeCAD::Base::Vector types must be provided
"""
if isAprox(a.x,b.x,tol) and isAprox(a.y,b.y,tol) and isAprox(a.z,b.z,tol):
return True
return False
def isSameVertex(a,b,tol=0.0001):
"""returns if two points are the same with a provided tolerance
@param a Point to compare.
@param b Reference point.
@param tol Radius of valid interval
@return True if twice point are the same, False otherwise
@note FreeCAD::Part::Vertex types must be provided
"""
if isAprox(a.X,b.X,tol) and isAprox(a.Y,b.Y,tol) and isAprox(a.Z,b.Z,tol):
return True
return False

View File

@ -1,55 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import FreeCAD, FreeCADGui, os
def modulePath():
"""returns the current Ship design module path
@return Module path"""
path1 = FreeCAD.ConfigGet("AppHomePath") + "Mod/Surfaces"
path2 = FreeCAD.ConfigGet("UserAppData") + "Mod/Surfaces"
if os.path.exists(path2):
return path2
else:
return path1
def iconsPath():
"""returns the current Ship design module icons path
@return Icons path"""
path = modulePath() + "/Icons"
return path
def getPathFromFile(fileName):
""" Gets the directory path from a file name
@param fileName Name of the file
@return Directory path.
"""
if not fileName:
return ''
i = 1
try:
while 1:
i = fileName.index("/", i+1)
except ValueError:
pass
return fileName[0:i+1]

View File

@ -1,30 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import FreeCAD, FreeCADGui, os
from PyQt4 import QtCore,QtGui
def translate(text,context="surfaces"):
"convenience function for Qt translator"
return QtGui.QApplication.translate(context, text, None,
QtGui.QApplication.UnicodeUTF8)

View File

@ -1,25 +0,0 @@
#***************************************************************************
#* *
#* Copyright (c) 2011, 2012 *
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# Empty file to treat the folder as a package

View File

@ -1,3 +0,0 @@
/** \defgroup SURFACES Surfaces
* \ingroup WORKBENCHES */