Revert "Added Surfaces module sources"

This reverts commit d3714a4281797f3895e1a1b7a0f1b892373fe925.
This commit is contained in:
Jose Luis Cercós pita 2011-12-30 10:59:56 +01:00 committed by Yorik van Havre
parent 9d5e11b1d8
commit 7b62299830
49 changed files with 0 additions and 7909 deletions

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

View File

@ -1,21 +0,0 @@
INSTALL(
FILES
BorderIco.png
BorderIco.xpm
ConvertIco.png
ConvertTo4SidesIco.xpm
Ico.xcf
IsoCurveIco.png
IsoCurveIco.xpm
SliceIco.xcf
BorderIco.xcf
ConvertIco.xcf
Ico.png
Ico.xpm
IsoCurveIco.xcf
SliceIco.png
SliceIco.xpm
DESTINATION
Mod/Surfaces/Icons
)

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

View File

@ -1,25 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/Icons
data_DATA = \
BorderIco.png \
BorderIco.xpm \
ConvertIco.png \
ConvertTo4SidesIco.xpm \
Ico.xcf \
IsoCurveIco.png \
IsoCurveIco.xpm \
SliceIco.png \
SliceIco.xpm \
BorderIco.xcf \
ConvertIco.xcf \
Ico.png \
Ico.xpm \
IsoCurveIco.xcf \
SliceIco.xcf
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

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,38 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
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,75 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
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,7 +0,0 @@
INSTALL(
FILES
__init__.py
DESTINATION
Mod/Surfaces/surfBorder
)

View File

@ -1,11 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/surfBorder
data_DATA = \
__init__.py
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

View File

@ -1,48 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,10 +0,0 @@
INSTALL(
FILES
__init__.py
Preview.py
TaskPanel.py
TaskPanel.ui
DESTINATION
Mod/Surfaces/surfConvert
)

View File

@ -1,14 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/surfConvert
data_DATA = \
__init__.py \
TaskPanel.py \
Preview.py \
TaskPanel.ui
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

View File

@ -1,79 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,576 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: Jose Luis Cercos Pita <jlcercos@gmail.com>
# Alicia Lapique <>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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.
if self.getEdgesFaces():
return True
# Ensure that closed object 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")
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.
"""
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.
@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.
@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 froms the starting and end U curves. All
# sample points will be reprojects 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 to get
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 las points column (end U curve)
self.sample.append(endU)
return False
def getSurfacePoints(self):
""" Get the points of the surface.
@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=[]
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)
for k in range(0,len(difs)):
if self.surfacesID[i][k] != self.surfacesID[i][k+1]:
if difs[k]>=(2*sumdif/len(difs)):
self.points[i][k][0]=self.points[i][k][0]+0.33*(self.points[i][k+1][0]-self.points[i][k][0])
self.points[i][k][1]=self.points[i][k][1]+0.33*(self.points[i][k+1][1]-self.points[i][k][1])
self.points[i][k][2]=self.points[i][k][2]+0.33*(self.points[i][k+1][2]-self.points[i][k][2])
self.points[i][k+1][0]=self.points[i][k+1][0]-0.33*(self.points[i][k+1][0]-self.points[i][k][0])
self.points[i][k+1][1]=self.points[i][k+1][1]-0.33*(self.points[i][k+1][1]-self.points[i][k][1])
self.points[i][k+1][2]=self.points[i][k+1][2]-0.33*(self.points[i][k+1][2]-self.points[i][k][2])
surf1 = self.faces[self.surfacesID[i][k]].Surface
surf2 = self.faces[self.surfacesID[i][k+1]].Surface
uv = surf1.parameter(self.points[i][k])
self.uv[i][k] = [uv[0], uv[1]]
uv = surf2.parameter(self.points[i][k+1])
self.uv[i][k+1] = [uv[0], uv[1]]
self.points[i][k]=surf1.value(self.uv[i][k][0],self.uv[i][k][1])
self.points[i][k+1]=surf2.value(self.uv[i][k+1][0],self.uv[i][k+1][1])
return True
break
continue
if difs[k]>=(2*sumdif/len(difs)):
self.uv[i][k][0]=self.uv[i][k][0]+0.33*(self.uv[i][k+1][0]-self.uv[i][k][0])
self.uv[i][k][1]=self.uv[i][k][1]+0.33*(self.uv[i][k+1][1]-self.uv[i][k][1])
self.uv[i][k+1][0]=self.uv[i][k+1][0]-0.33*(self.uv[i][k+1][0]-self.uv[i][k][0])
self.uv[i][k+1][1]=self.uv[i][k+1][1]-0.33*(self.uv[i][k+1][1]-self.uv[i][k][1])
surf = self.faces[self.surfacesID[i][k]].Surface
self.points[i][k] = surf.value(self.uv[i][k][0], self.uv[i][k][1])
self.points[i][k+1] = surf.value(self.uv[i][k+1][0], self.uv[i][k+1][1])
return True
break
return False
def redistributePointsV(self):
""" Redistributes the points of the surface (V direction).
@return False if all points are right placed. True otherwise.
"""
#Redistribute files
for i in range(0,len(self.points[0])):
sumdif=0
difs=[]
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)
for k in range(0,len(difs)):
if self.surfacesID[k][i] != self.surfacesID[k+1][i]:
if difs[k]>=(2*sumdif/len(difs)):
self.points[k][i][0]=self.points[k][i][0]+0.33*(self.points[k+1][i][0]-self.points[k][i][0])
self.points[k][i][1]=self.points[k][i][1]+0.33*(self.points[k+1][i][1]-self.points[k][i][1])
self.points[k][i][2]=self.points[k][i][2]+0.33*(self.points[k+1][k+1][2]-self.points[k][i][2])
self.points[k+1][i][0]=self.points[k+1][i][0]-0.33*(self.points[k+1][i][0]-self.points[k][i][0])
self.points[k+1][i][1]=self.points[k+1][i][1]-0.33*(self.points[k+1][i][1]-self.points[k][i][1])
self.points[k+1][i][2]=self.points[k+1][i][2]-0.33*(self.points[k+1][i][2]-self.points[k][i][2])
surf1 = self.faces[self.surfacesID[k][i]].Surface
surf2 = self.faces[self.surfacesID[k+1][i]].Surface
uv = surf1.parameter(self.points[k][i])
self.uv[k][i] = [uv[0], uv[1]]
uv = surf2.parameter(self.points[k+1][i])
self.uv[k+1][i] = [uv[0], uv[1]]
self.points[k][i]=surf1.value(self.uv[k][i][0],self.uv[k][i][1])
self.points[k+1][i]=surf2.value(self.uv[k+1][i][0],self.uv[k+1][i][1])
return True
break
continue
if difs[k]>=(2*sumdif/len(difs)):
self.uv[k][i][0]=self.uv[k][i][0]+0.33*(self.uv[k+1][i][0]-self.uv[k][i][0])
self.uv[k][i][1]=self.uv[k][i][1]+0.33*(self.uv[k+1][i][1]-self.uv[k][i][1])
self.uv[k+1][i][0]=self.uv[k+1][i][0]-0.33*(self.uv[k+1][i][0]-self.uv[k][i][0])
self.uv[k+1][i][1]=self.uv[k+1][i][1]-0.33*(self.uv[k+1][i][1]-self.uv[k][i][1])
surf = self.faces[self.surfacesID[k][i]].Surface
self.points[k][i] = surf.value(self.uv[k][i][0], self.uv[k][i][1])
self.points[k+1][i] = surf.value(self.uv[k+1][i][0], self.uv[k+1][i][1])
return True
break
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,34 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,11 +0,0 @@
INSTALL(
FILES
__init__.py
PointTracker.py
TaskPanel.py
Preview.py
TaskPanel.ui
DESTINATION
Mod/Surfaces/surfISOCurve
)

View File

@ -1,16 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/surfISOCurve
data_DATA = \
__init__.py \
Preview.py \
TaskPanel.ui \
PointTracker.py \
TaskPanel.py \
Preview.py
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

View File

@ -1,85 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,122 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,165 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,34 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,11 +0,0 @@
INSTALL(
FILES
__init__.py
PointTracker.py
TaskPanel.py
Preview.py
TaskPanel.ui
DESTINATION
Mod/Surfaces/surfSlice
)

View File

@ -1,15 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/surfSlice
data_DATA = \
__init__.py \
Preview.py \
TaskPanel.ui \
PointTracker.py \
TaskPanel.py
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

View File

@ -1,68 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,97 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,214 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,34 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# 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,11 +0,0 @@
INSTALL(
FILES
__init__.py
Geometry.py
Math.py
Paths.py
Translator.py
DESTINATION
Mod/Surfaces/surfUtils
)

View File

@ -1,171 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
import math
# FreeCAD
import FreeCAD, FreeCADGui
from FreeCAD import Base
from FreeCAD 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,15 +0,0 @@
datadir = $(prefix)/Mod/Surfaces/surfUtils
data_DATA = \
__init__.py \
Math.py \
Translator.py \
Geometry.py \
Paths.py
CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
$(data_DATA) \
CMakeLists.txt

View File

@ -1,54 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
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,52 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
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,27 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
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,22 +0,0 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# Author: 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 General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Empty file to treat the folder as a package