diff options
author | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
---|---|---|
committer | neodarz <neodarz@neodarz.net> | 2018-08-11 20:21:34 +0200 |
commit | 0ea5fc66924303d1bf73ba283a383e2aadee02f2 (patch) | |
tree | 2568e71a7ccc44ec23b8bb3f0ff97fb6bf2ed709 /docs/doxygen/nel/primitive_8cpp-source.html | |
download | nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.tar.xz nevrax-website-self-hostable-0ea5fc66924303d1bf73ba283a383e2aadee02f2.zip |
Initial commit
Diffstat (limited to 'docs/doxygen/nel/primitive_8cpp-source.html')
-rw-r--r-- | docs/doxygen/nel/primitive_8cpp-source.html | 1965 |
1 files changed, 1965 insertions, 0 deletions
diff --git a/docs/doxygen/nel/primitive_8cpp-source.html b/docs/doxygen/nel/primitive_8cpp-source.html new file mode 100644 index 00000000..da3c406d --- /dev/null +++ b/docs/doxygen/nel/primitive_8cpp-source.html @@ -0,0 +1,1965 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>primitive.cpp</h1><a href="primitive_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00007 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> +00008 <font class="comment"> *</font> +00009 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00013 <font class="comment"> * any later version.</font> +00014 <font class="comment"></font> +00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00018 <font class="comment"> * General Public License for more details.</font> +00019 <font class="comment"></font> +00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00023 <font class="comment"> * MA 02111-1307, USA.</font> +00024 <font class="comment"> */</font> +00025 +00026 <font class="preprocessor">#include "<a class="code" href="primitive_8h.html">nel/ligo/primitive.h</a>"</font> +00027 <font class="preprocessor">#include "<a class="code" href="i__xml_8h.html">nel/misc/i_xml.h</a>"</font> +00028 +00029 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00030 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00031 +<a name="l00032"></a><a class="code" href="primitive_8cpp.html#a0">00032</a> <font class="preprocessor">#define NLLIGO_PRIMITVE_VERSION 0</font> +00033 <font class="preprocessor"></font> +00034 <font class="keyword">namespace </font>NLLIGO +00035 { +00036 +00037 <font class="comment">// ***************************************************************************</font> +00038 <font class="comment">// XML helpers</font> +00039 <font class="comment">// ***************************************************************************</font> +00040 +00041 <font class="keywordtype">void</font> <a class="code" href="namespaceNLLIGO.html#a2">Error</a> (<font class="keyword">const</font> <font class="keywordtype">char</font> *filename, <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, ...) +00042 { +00043 va_list args; +00044 va_start( args, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a> ); +00045 <font class="keywordtype">char</font> buffer[1024]; +00046 sint ret = vsnprintf( buffer, 1024, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, args ); +00047 va_end( args ); +00048 +00049 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"In File (%s) %s"</font>, filename, buffer); +00050 } +00051 +00052 <font class="comment">// ***************************************************************************</font> +00053 +00054 <font class="keywordtype">void</font> <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, ... ) +00055 { +00056 va_list args; +00057 va_start( args, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a> ); +00058 <font class="keywordtype">char</font> buffer[1024]; +00059 sint ret = vsnprintf( buffer, 1024, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>, args ); +00060 va_end( args ); +00061 +00062 <a class="code" href="namespaceNLLIGO.html#a2">Error</a> (filename, <font class="stringliteral">"node (%s), line (%d) : %s"</font>, xmlNode->name, (<font class="keywordtype">int</font>)xmlNode->content, buffer); +00063 } +00064 +00065 +00066 <font class="comment">// ***************************************************************************</font> +00067 +00068 xmlNodePtr <a class="code" href="namespaceNLLIGO.html#a4">GetFirstChildNode</a> (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, <font class="keyword">const</font> <font class="keywordtype">char</font> *childName) +00069 { +00070 <font class="comment">// Call the CIXml version</font> +00071 xmlNodePtr result; +00072 <font class="keywordflow">if</font> ((result = CIXml::getFirstChildNode (xmlNode, childName))) +00073 { +00074 <font class="keywordflow">return</font> result; +00075 } +00076 <font class="keywordflow">else</font> +00077 { +00078 <font class="comment">// Output a formated error</font> +00079 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"Can't find XML node named (%s)"</font>, childName); +00080 <font class="keywordflow">return</font> NULL; +00081 } +00082 } +00083 +00084 <font class="comment">// ***************************************************************************</font> +00085 +00086 <font class="keywordtype">bool</font> <a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (string &result, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *propName) +00087 { +00088 <font class="comment">// Call the CIXml version</font> +00089 <font class="keywordflow">if</font> (!CIXml::getPropertyString (result, xmlNode, propName)) +00090 { +00091 <font class="comment">// Output a formated error</font> +00092 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"Can't find XML node property (%s)"</font>, propName); +00093 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00094 } +00095 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00096 } +00097 +00098 <font class="comment">// ***************************************************************************</font> +00099 +00100 <font class="keywordtype">bool</font> <a class="code" href="namespaceNLLIGO.html#a6">ReadFloat</a> (<font class="keyword">const</font> <font class="keywordtype">char</font> *propName, <font class="keywordtype">float</font> &result, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, xmlNodePtr xmlNode) +00101 { +00102 string <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>; +00103 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, filename, xmlNode, propName)) +00104 { +00105 result = (float)atof (<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>.c_str ()); +00106 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00107 } +00108 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00109 } +00110 +00111 <font class="comment">// ***************************************************************************</font> +00112 +00113 <font class="keywordtype">bool</font> <a class="code" href="namespaceNLLIGO.html#a7">ReadVector</a> (CPrimVector &point, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, xmlNodePtr xmlNode) +00114 { +00115 CPrimVector pos; +00116 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a6">ReadFloat</a> (<font class="stringliteral">"X"</font>, pos.x, filename, xmlNode)) +00117 { +00118 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a6">ReadFloat</a> (<font class="stringliteral">"Y"</font>, pos.y, filename, xmlNode)) +00119 { +00120 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a6">ReadFloat</a> (<font class="stringliteral">"Z"</font>, pos.z, filename, xmlNode)) +00121 { +00122 pos.Selected = <font class="keyword">false</font>; +00123 string result; +00124 <font class="keywordflow">if</font> (CIXml::getPropertyString (result, xmlNode, <font class="stringliteral">"SELECTED"</font>)) +00125 { +00126 <font class="keywordflow">if</font> (result == <font class="stringliteral">"true"</font>) +00127 pos.Selected = <font class="keyword">true</font>; +00128 } +00129 point = pos; +00130 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00131 } +00132 } +00133 } +00134 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00135 } +00136 +00137 <font class="comment">// ***************************************************************************</font> +00138 +00139 <font class="keywordtype">void</font> <a class="code" href="namespaceNLLIGO.html#a8">WriteVector</a> (<font class="keyword">const</font> CPrimVector &point, xmlNodePtr xmlNode) +00140 { +00141 <font class="comment">// Set properties</font> +00142 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"X"</font>, (<font class="keyword">const</font> xmlChar*)(toString (point.x).c_str ())); +00143 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"Y"</font>, (<font class="keyword">const</font> xmlChar*)(toString (point.y).c_str ())); +00144 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"Z"</font>, (<font class="keyword">const</font> xmlChar*)(toString (point.z).c_str ())); +00145 <font class="keywordflow">if</font> (point.Selected) +00146 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"SELECTED"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"true"</font>); +00147 } +00148 +00149 <font class="comment">// ***************************************************************************</font> +00150 +00151 <font class="keywordtype">void</font> <a class="code" href="namespaceNLLIGO.html#a9">WriteFloat</a> (<font class="keyword">const</font> <font class="keywordtype">char</font> *propName, <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>, xmlNodePtr xmlNode) +00152 { +00153 <font class="comment">// Set properties</font> +00154 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)propName, (<font class="keyword">const</font> xmlChar*)(toString (value).c_str ())); +00155 } +00156 +00157 <font class="comment">// ***************************************************************************</font> +00158 +00159 <font class="keywordtype">bool</font> <a class="code" href="namespaceNLLIGO.html#a10">GetNodeString</a> (string &result, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *nodeName) +00160 { +00161 <font class="comment">// Look for the node</font> +00162 xmlNodePtr node = CIXml::getFirstChildNode (xmlNode, nodeName); +00163 <font class="keywordflow">if</font> (!node) +00164 { +00165 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"Can't find XML node named (%s)"</font>, nodeName); +00166 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00167 } +00168 +00169 <font class="comment">// Get the node string</font> +00170 <font class="keywordflow">if</font> (!CIXml::getContentString (result, node)) +00171 { +00172 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"Can't find any text in the node named (%s)"</font>, nodeName); +00173 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00174 } +00175 +00176 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00177 } +00178 +00179 <font class="comment">// ***************************************************************************</font> +00180 +00181 <font class="keywordtype">bool</font> <a class="code" href="namespaceNLLIGO.html#a11">GetContentString</a> (string &result, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, xmlNodePtr xmlNode) +00182 { +00183 <font class="comment">// Get the node string</font> +00184 <font class="keywordflow">if</font> (!CIXml::getContentString (result, xmlNode)) +00185 { +00186 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"Can't find any text in the node"</font>); +00187 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00188 } +00189 +00190 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00191 } +00192 +00193 <font class="comment">// ***************************************************************************</font> +00194 <font class="comment">// CPropertyString</font> +00195 <font class="comment">// ***************************************************************************</font> +00196 +<a name="l00197"></a><a class="code" href="classNLLIGO_1_1CPropertyString.html#a1">00197</a> CPropertyString::CPropertyString (<font class="keyword">const</font> <font class="keywordtype">char</font> *str) +00198 { +00199 <a class="code" href="classNLLIGO_1_1CPropertyString.html#m0">String</a> = str; +00200 } +00201 +00202 <font class="comment">// ***************************************************************************</font> +00203 <font class="comment">// CPropertyStringArray</font> +00204 <font class="comment">// ***************************************************************************</font> +00205 +<a name="l00206"></a><a class="code" href="classNLLIGO_1_1CPropertyStringArray.html#a1">00206</a> CPropertyStringArray::CPropertyStringArray (<font class="keyword">const</font> std::vector<std::string> &stringArray) +00207 { +00208 <a class="code" href="classNLLIGO_1_1CPropertyStringArray.html#m0">StringArray</a> = stringArray; +00209 } +00210 +00211 <font class="comment">// ***************************************************************************</font> +00212 +<a name="l00213"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#a1">00213</a> <font class="keywordtype">void</font> CPrimPoint::serial (IStream &f) +00214 { +00215 f.xmlPushBegin (<font class="stringliteral">"POINT"</font>); +00216 +00217 f.xmlSetAttrib (<font class="stringliteral">"NAME"</font>); +00218 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m1">Name</a>); +00219 f.xmlSetAttrib (<font class="stringliteral">"LAYER"</font>); +00220 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m0">Layer</a>); +00221 f.xmlPushEnd (); +00222 +00223 f.serial (<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m0">Point</a>); +00224 +00225 <font class="keywordflow">if</font> (f.isReading ()) +00226 { +00227 <a class="code" href="classNLLIGO_1_1CPrimPoint.html#m1">Angle</a> = 0; +00228 } +00229 +00230 f.xmlPop (); +00231 } +00232 +00233 <font class="comment">// ***************************************************************************</font> +<a name="l00234"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#a0">00234</a> <font class="keywordtype">void</font> CPrimPath::serial (IStream &f) +00235 { +00236 f.xmlPushBegin (<font class="stringliteral">"PATH"</font>); +00237 +00238 f.xmlSetAttrib (<font class="stringliteral">"NAME"</font>); +00239 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m1">Name</a>); +00240 f.xmlSetAttrib (<font class="stringliteral">"LAYER"</font>); +00241 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m0">Layer</a>); +00242 f.xmlPushEnd (); +00243 +00244 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>); +00245 +00246 f.xmlPop (); +00247 } +00248 +00249 <font class="comment">// ***************************************************************************</font> +00250 +<a name="l00251"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#d3">00251</a> <font class="keywordtype">bool</font> CPrimZone::contains (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, <font class="keyword">const</font> std::vector<CPrimVector> &points) +00252 { +00253 uint32 i; +00254 CVector vMin, vMax; +00255 +00256 <font class="comment">// Point or line can't contains !</font> +00257 <font class="keywordflow">if</font> (points.size() < 3) +00258 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00259 +00260 <font class="comment">// Get the bounding rectangle of the zone</font> +00261 vMax = vMin = points[0]; +00262 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00263 { +00264 <font class="keywordflow">if</font> (vMin.x > points[i].x) +00265 vMin.x = points[i].x; +00266 <font class="keywordflow">if</font> (vMin.y > points[i].y) +00267 vMin.y = points[i].y; +00268 +00269 <font class="keywordflow">if</font> (vMax.x < points[i].x) +00270 vMax.x = points[i].x; +00271 <font class="keywordflow">if</font> (vMax.y < points[i].y) +00272 vMax.y = points[i].y; +00273 } +00274 +00275 <font class="keywordflow">if</font> ((v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> < vMin.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> < vMin.y) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> > vMax.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> > vMax.y)) +00276 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00277 +00278 uint32 nNbIntersection = 0; +00279 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00280 { +00281 <font class="keyword">const</font> CVector &p1 = points[i]; +00282 <font class="keyword">const</font> CVector &p2 = points[(i+1)%points.size()]; +00283 +00284 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)) +00285 <font class="keywordflow">continue</font>; +00286 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)) +00287 <font class="keywordflow">continue</font>; +00288 <font class="keywordtype">float</font> xinter = p1.x + (p2.x-p1.x) * ((v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>-p1.y)/(p2.y-p1.y)); +00289 <font class="keywordflow">if</font> (xinter > v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>) +00290 ++nNbIntersection; +00291 } +00292 <font class="keywordflow">if</font> ((nNbIntersection&1) == 1) <font class="comment">// odd intersections so the vertex is inside</font> +00293 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00294 <font class="keywordflow">else</font> +00295 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00296 } +00297 +00298 <font class="comment">// ***************************************************************************</font> +00299 +<a name="l00300"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#d1">00300</a> <font class="keywordtype">bool</font> CPrimZone::contains (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, <font class="keyword">const</font> std::vector<NLMISC::CVector> &points) +00301 { +00302 uint32 i; +00303 CVector vMin, vMax; +00304 +00305 <font class="comment">// Point or line can't contains !</font> +00306 <font class="keywordflow">if</font> (points.size() < 3) +00307 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00308 +00309 <font class="comment">// Get the bounding rectangle of the zone</font> +00310 vMax = vMin = points[0]; +00311 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00312 { +00313 <font class="keywordflow">if</font> (vMin.x > points[i].x) +00314 vMin.x = points[i].x; +00315 <font class="keywordflow">if</font> (vMin.y > points[i].y) +00316 vMin.y = points[i].y; +00317 +00318 <font class="keywordflow">if</font> (vMax.x < points[i].x) +00319 vMax.x = points[i].x; +00320 <font class="keywordflow">if</font> (vMax.y < points[i].y) +00321 vMax.y = points[i].y; +00322 } +00323 +00324 <font class="keywordflow">if</font> ((v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> < vMin.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> < vMin.y) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> > vMax.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> > vMax.y)) +00325 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00326 +00327 uint32 nNbIntersection = 0; +00328 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00329 { +00330 <font class="keyword">const</font> CVector &p1 = points[i]; +00331 <font class="keyword">const</font> CVector &p2 = points[(i+1)%points.size()]; +00332 +00333 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)) +00334 <font class="keywordflow">continue</font>; +00335 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)) +00336 <font class="keywordflow">continue</font>; +00337 <font class="keywordtype">float</font> xinter = p1.x + (p2.x-p1.x) * ((v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>-p1.y)/(p2.y-p1.y)); +00338 <font class="keywordflow">if</font> (xinter > v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>) +00339 ++nNbIntersection; +00340 } +00341 <font class="keywordflow">if</font> ((nNbIntersection&1) == 1) <font class="comment">// odd intersections so the vertex is inside</font> +00342 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00343 <font class="keywordflow">else</font> +00344 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00345 } +00346 +00347 <font class="comment">// ***************************************************************************</font> +00348 <font class="comment">// CPrimNode</font> +00349 <font class="comment">// ***************************************************************************</font> +00350 +<a name="l00351"></a><a class="code" href="classNLLIGO_1_1CPrimNode.html#c3">00351</a> <font class="keywordtype">bool</font> CPrimNode::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint version) +00352 { +00353 <font class="keywordflow">return</font> IPrimitive::read (xmlNode, filename, version); +00354 } +00355 +00356 <font class="comment">// ***************************************************************************</font> +00357 +<a name="l00358"></a><a class="code" href="classNLLIGO_1_1CPrimNode.html#c4">00358</a> <font class="keywordtype">void</font> CPrimNode::write (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +00359 <font class="keyword"></font>{ +00360 <font class="comment">// Set the type</font> +00361 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"node"</font>); +00362 +00363 IPrimitive::write (xmlNode, filename); +00364 } +00365 +00366 <font class="comment">// ***************************************************************************</font> +00367 +<a name="l00368"></a><a class="code" href="classNLLIGO_1_1CPrimNode.html#c0">00368</a> uint CPrimNode::getNumVector ()<font class="keyword"> const</font> +00369 <font class="keyword"></font>{ +00370 <font class="keywordflow">return</font> 0; +00371 } +00372 +00373 <font class="comment">// ***************************************************************************</font> +00374 +<a name="l00375"></a><a class="code" href="classNLLIGO_1_1CPrimNode.html#c1">00375</a> <font class="keyword">const</font> CPrimVector *CPrimNode::getPrimVector ()<font class="keyword"> const</font> +00376 <font class="keyword"></font>{ +00377 <font class="keywordflow">return</font> NULL; +00378 } +00379 +00380 <font class="comment">// ***************************************************************************</font> +00381 +<a name="l00382"></a><a class="code" href="classNLLIGO_1_1CPrimNode.html#c2">00382</a> CPrimVector *CPrimNode::getPrimVector () +00383 { +00384 <font class="keywordflow">return</font> NULL; +00385 } +00386 +00387 <font class="comment">// ***************************************************************************</font> +00388 <font class="comment">// CPrimNode</font> +00389 <font class="comment">// ***************************************************************************</font> +00390 +00391 <font class="comment">/*void CPrimNode::operator= (const CPrimNode &node)</font> +00392 <font class="comment">{</font> +00393 <font class="comment"> // Copy the IPrimitive</font> +00394 <font class="comment"> IPrimitive::operator= (node);</font> +00395 <font class="comment">}</font> +00396 <font class="comment"></font> +00397 <font class="comment">// ***************************************************************************</font> +00398 <font class="comment"></font> +00399 <font class="comment">void CPrimPoint::operator= (const CPrimPoint &node)</font> +00400 <font class="comment">{</font> +00401 <font class="comment"> // Copy the IPrimitive</font> +00402 <font class="comment"> IPrimitive::operator= (node);</font> +00403 <font class="comment">}</font> +00404 <font class="comment"></font> +00405 <font class="comment">// ***************************************************************************</font> +00406 <font class="comment"></font> +00407 <font class="comment">void CPrimPath::operator= (const CPrimPath &node)</font> +00408 <font class="comment">{</font> +00409 <font class="comment"> // Copy the IPrimitive</font> +00410 <font class="comment">}</font> +00411 <font class="comment"></font> +00412 <font class="comment">// ***************************************************************************</font> +00413 <font class="comment"></font> +00414 <font class="comment">void CPrimZone::operator= (const CPrimZone &node)</font> +00415 <font class="comment">{</font> +00416 <font class="comment"> // Copy the IPrimitive</font> +00417 <font class="comment"> IPrimitive::operator= (node);</font> +00418 <font class="comment">}</font> +00419 <font class="comment">*/</font> +00420 +00421 <font class="comment">// ***************************************************************************</font> +00422 +<a name="l00423"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#c0">00423</a> uint CPrimPoint::getNumVector ()<font class="keyword"> const</font> +00424 <font class="keyword"></font>{ +00425 <font class="keywordflow">return</font> 1; +00426 } +00427 +00428 <font class="comment">// ***************************************************************************</font> +00429 +<a name="l00430"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#c1">00430</a> <font class="keyword">const</font> CPrimVector *CPrimPoint::getPrimVector ()<font class="keyword"> const</font> +00431 <font class="keyword"></font>{ +00432 <font class="keywordflow">return</font> &<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m0">Point</a>; +00433 } +00434 +00435 <font class="comment">// ***************************************************************************</font> +00436 +<a name="l00437"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#c2">00437</a> CPrimVector *CPrimPoint::getPrimVector () +00438 { +00439 <font class="keywordflow">return</font> &<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m0">Point</a>; +00440 } +00441 +00442 <font class="comment">// ***************************************************************************</font> +00443 +<a name="l00444"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#c3">00444</a> <font class="keywordtype">bool</font> CPrimPoint::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint version) +00445 { +00446 <font class="comment">// Read points</font> +00447 xmlNodePtr ptNode = <a class="code" href="namespaceNLLIGO.html#a4">GetFirstChildNode</a> (xmlNode, filename, <font class="stringliteral">"PT"</font>); +00448 <font class="keywordflow">if</font> (ptNode) +00449 { +00450 <font class="comment">// Read a vector</font> +00451 <font class="keywordflow">if</font> (!<a class="code" href="namespaceNLLIGO.html#a7">ReadVector</a> (<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m0">Point</a>, filename, ptNode)) +00452 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00453 +00454 ptNode = <a class="code" href="namespaceNLLIGO.html#a4">GetFirstChildNode</a> (xmlNode, filename, <font class="stringliteral">"ANGLE"</font>); +00455 <font class="keywordflow">if</font> (ptNode) +00456 { +00457 <font class="comment">// Read a float</font> +00458 <font class="keywordflow">if</font> (!<a class="code" href="namespaceNLLIGO.html#a6">ReadFloat</a> (<font class="stringliteral">"VALUE"</font>, <a class="code" href="classNLLIGO_1_1CPrimPoint.html#m1">Angle</a>, filename, ptNode)) +00459 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00460 } +00461 <font class="keywordflow">else</font> +00462 <a class="code" href="classNLLIGO_1_1CPrimPoint.html#m1">Angle</a> = 0; +00463 } +00464 <font class="keywordflow">else</font> +00465 { +00466 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00467 } +00468 +00469 <font class="keywordflow">return</font> IPrimitive::read (xmlNode, filename, version); +00470 } +00471 +00472 <font class="comment">// ***************************************************************************</font> +00473 +<a name="l00474"></a><a class="code" href="classNLLIGO_1_1CPrimPoint.html#c4">00474</a> <font class="keywordtype">void</font> CPrimPoint::write (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +00475 <font class="keyword"></font>{ +00476 <font class="comment">// Set the type</font> +00477 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"point"</font>); +00478 +00479 <font class="comment">// Save the point</font> +00480 xmlNodePtr ptNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"PT"</font>, NULL); +00481 <a class="code" href="namespaceNLLIGO.html#a8">WriteVector</a> (<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m0">Point</a>, ptNode); +00482 +00483 <font class="comment">// Save the angle</font> +00484 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1CPrimPoint.html#m1">Angle</a> != 0) +00485 { +00486 xmlNodePtr ptNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"ANGLE"</font>, NULL); +00487 <a class="code" href="namespaceNLLIGO.html#a9">WriteFloat</a> (<font class="stringliteral">"VALUE"</font>, <a class="code" href="classNLLIGO_1_1CPrimPoint.html#m1">Angle</a>, ptNode); +00488 } +00489 +00490 IPrimitive::write (xmlNode, filename); +00491 } +00492 +00493 <font class="comment">// ***************************************************************************</font> +00494 <font class="comment">// CPrimPath</font> +00495 <font class="comment">// ***************************************************************************</font> +00496 +<a name="l00497"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#c0">00497</a> uint CPrimPath::getNumVector ()<font class="keyword"> const</font> +00498 <font class="keyword"></font>{ +00499 <font class="keywordflow">return</font> <a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.size (); +00500 } +00501 +00502 <font class="comment">// ***************************************************************************</font> +00503 +<a name="l00504"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#c1">00504</a> <font class="keyword">const</font> CPrimVector *CPrimPath::getPrimVector ()<font class="keyword"> const</font> +00505 <font class="keyword"></font>{ +00506 <font class="keywordflow">return</font> &(<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>[0]); +00507 } +00508 +00509 <font class="comment">// ***************************************************************************</font> +00510 +<a name="l00511"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#c2">00511</a> CPrimVector *CPrimPath::getPrimVector () +00512 { +00513 <font class="keywordflow">return</font> &(<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>[0]); +00514 } +00515 +00516 <font class="comment">// ***************************************************************************</font> +00517 +<a name="l00518"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#c3">00518</a> <font class="keywordtype">bool</font> CPrimPath::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint version) +00519 { +00520 <font class="comment">// Read points</font> +00521 <a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.clear (); +00522 <a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.reserve (CIXml::countChildren (xmlNode, <font class="stringliteral">"PT"</font>)); +00523 xmlNodePtr ptNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"PT"</font>); +00524 <font class="keywordflow">if</font> (ptNode) +00525 { +00526 <font class="keywordflow">do</font> +00527 { +00528 <font class="comment">// Read a vector</font> +00529 <a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.push_back (CPrimVector ()); +00530 <font class="keywordflow">if</font> (!<a class="code" href="namespaceNLLIGO.html#a7">ReadVector</a> (<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.back (), filename, ptNode)) +00531 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00532 } +00533 <font class="keywordflow">while</font> ((ptNode = CIXml::getNextChildNode (ptNode, <font class="stringliteral">"PT"</font>))); +00534 } +00535 +00536 <font class="keywordflow">return</font> IPrimitive::read (xmlNode, filename, version); +00537 } +00538 +00539 <font class="comment">// ***************************************************************************</font> +00540 +<a name="l00541"></a><a class="code" href="classNLLIGO_1_1CPrimPath.html#c4">00541</a> <font class="keywordtype">void</font> CPrimPath::write (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +00542 <font class="keyword"></font>{ +00543 <font class="comment">// Set the type</font> +00544 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"path"</font>); +00545 +00546 <font class="comment">// Save the points</font> +00547 <font class="keywordflow">for</font> (uint i=0; i<<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>.size (); i++) +00548 { +00549 xmlNodePtr ptNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"PT"</font>, NULL); +00550 <a class="code" href="namespaceNLLIGO.html#a8">WriteVector</a> (<a class="code" href="classNLLIGO_1_1CPrimPath.html#m0">VPoints</a>[i], ptNode); +00551 } +00552 +00553 IPrimitive::write (xmlNode, filename); +00554 } +00555 +00556 <font class="comment">// ***************************************************************************</font> +00557 <font class="comment">// CPrimZone</font> +00558 <font class="comment">// ***************************************************************************</font> +00559 +<a name="l00560"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#c0">00560</a> uint CPrimZone::getNumVector ()<font class="keyword"> const</font> +00561 <font class="keyword"></font>{ +00562 <font class="keywordflow">return</font> <a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.size (); +00563 } +00564 +00565 <font class="comment">// ***************************************************************************</font> +00566 +<a name="l00567"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#c1">00567</a> <font class="keyword">const</font> CPrimVector *CPrimZone::getPrimVector ()<font class="keyword"> const</font> +00568 <font class="keyword"></font>{ +00569 <font class="keywordflow">return</font> &(<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>[0]); +00570 } +00571 +00572 <font class="comment">// ***************************************************************************</font> +00573 +<a name="l00574"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#c2">00574</a> CPrimVector *CPrimZone::getPrimVector () +00575 { +00576 <font class="keywordflow">return</font> &(<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>[0]); +00577 } +00578 +00579 <font class="comment">// ***************************************************************************</font> +00580 +<a name="l00581"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#c3">00581</a> <font class="keywordtype">bool</font> CPrimZone::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint version) +00582 { +00583 <font class="comment">// Read points</font> +00584 <a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.clear (); +00585 <a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.reserve (CIXml::countChildren (xmlNode, <font class="stringliteral">"PT"</font>)); +00586 xmlNodePtr ptNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"PT"</font>); +00587 <font class="keywordflow">if</font> (ptNode) +00588 { +00589 <font class="keywordflow">do</font> +00590 { +00591 <font class="comment">// Read a vector</font> +00592 <a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.push_back (CPrimVector ()); +00593 <font class="keywordflow">if</font> (!<a class="code" href="namespaceNLLIGO.html#a7">ReadVector</a> (<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.back (), filename, ptNode)) +00594 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00595 } +00596 <font class="keywordflow">while</font> ((ptNode = CIXml::getNextChildNode (ptNode, <font class="stringliteral">"PT"</font>))); +00597 } +00598 +00599 <font class="keywordflow">return</font> IPrimitive::read (xmlNode, filename, version); +00600 } +00601 +00602 <font class="comment">// ***************************************************************************</font> +00603 +<a name="l00604"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#c4">00604</a> <font class="keywordtype">void</font> CPrimZone::write (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +00605 <font class="keyword"></font>{ +00606 <font class="comment">// Set the type</font> +00607 xmlSetProp (xmlNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"zone"</font>); +00608 +00609 <font class="comment">// Save the points</font> +00610 <font class="keywordflow">for</font> (uint i=0; i<<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>.size (); i++) +00611 { +00612 xmlNodePtr ptNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"PT"</font>, NULL); +00613 <a class="code" href="namespaceNLLIGO.html#a8">WriteVector</a> (<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>[i], ptNode); +00614 } +00615 +00616 IPrimitive::write (xmlNode, filename); +00617 } +00618 +00619 <font class="comment">// ***************************************************************************</font> +00620 +<a name="l00621"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#d4">00621</a> <font class="keywordtype">bool</font> CPrimZone::contains (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, <font class="keyword">const</font> std::vector<CPrimVector> &points, <font class="keywordtype">float</font> &distance, <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &nearPos, <font class="keywordtype">bool</font> isPath) +00622 { +00623 uint32 i; +00624 CVector vMin, vMax; +00625 <font class="keywordtype">float</font> nearest = FLT_MAX; +00626 CVector pos; +00627 +00628 <font class="comment">// Point or line can't contains !</font> +00629 <font class="keywordflow">if</font> (points.size() < 3 || isPath) +00630 { +00631 <font class="comment">// only compute the distance.</font> +00632 <font class="keywordflow">if</font> (points.size() == 1) +00633 { +00634 distance = (points[0] - v).norm(); +00635 nearPos = points[0]; +00636 } +00637 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (points.size() == 2) +00638 { +00639 distance = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, points[0], points[1], nearPos); +00640 } +00641 <font class="keywordflow">else</font> +00642 { +00643 <font class="comment">// compute nearest segment</font> +00644 <font class="keywordflow">for</font> (i = 0; i < points.size()-1; ++i) +00645 { +00646 <font class="keyword">const</font> CVector &p1 = points[i]; +00647 <font class="keyword">const</font> CVector &p2 = points[i+1]; +00648 +00649 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, p1, p2, pos); +00650 <font class="keywordflow">if</font>( dist < nearest) +00651 { +00652 nearest = dist; +00653 nearPos = pos; +00654 } +00655 } +00656 distance = nearest; +00657 } +00658 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00659 } +00660 +00661 <font class="comment">// Get the bounding rectangle of the zone</font> +00662 vMax = vMin = points[0]; +00663 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00664 { +00665 vMin.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = <a class="code" href="bit__set_8cpp.html#a0">min</a>(vMin.x, points[i].x); +00666 vMin.y = <a class="code" href="bit__set_8cpp.html#a0">min</a>(vMin.y, points[i].y); +00667 vMax.x = max(vMax.x, points[i].x); +00668 vMax.y = max(vMax.y, points[i].y); +00669 } +00670 +00671 <font class="keywordflow">if</font> ((v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> < vMin.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> < vMin.y) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> > vMax.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> > vMax.y)) +00672 { +00673 <font class="comment">// find the nearest distance of all segment</font> +00674 <font class="keywordflow">for</font> (uint i=0; i<points.size(); ++i) +00675 { +00676 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, points[i], points[(i+1) % points.size()], pos); +00677 +00678 <font class="keywordflow">if</font> (dist < nearest) +00679 { +00680 nearest = dist; +00681 nearPos = pos; +00682 } +00683 } +00684 distance = nearest; +00685 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00686 } +00687 +00688 uint32 nNbIntersection = 0; +00689 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00690 { +00691 <font class="keyword">const</font> CVector &p1 = points[i]; +00692 <font class="keyword">const</font> CVector &p2 = points[(i+1)%points.size()]; +00693 +00694 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, p1, p2, pos); +00695 <font class="keywordflow">if</font>( dist < nearest) +00696 { +00697 nearest = dist; +00698 nearPos = pos; +00699 } +00700 +00701 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)) +00702 <font class="keywordflow">continue</font>; +00703 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)) +00704 <font class="keywordflow">continue</font>; +00705 <font class="keywordtype">float</font> xinter = p1.x + (p2.x-p1.x) * ((v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>-p1.y)/(p2.y-p1.y)); +00706 <font class="keywordflow">if</font> (xinter > v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>) +00707 ++nNbIntersection; +00708 } +00709 +00710 distance = nearest; +00711 <font class="keywordflow">if</font> ((nNbIntersection&1) == 1) <font class="comment">// odd intersections so the vertex is inside</font> +00712 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00713 <font class="keywordflow">else</font> +00714 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00715 } +00716 +00717 <font class="comment">// ***************************************************************************</font> +00718 +00719 <font class="keywordtype">bool</font> CPrimZone::contains (<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>, <font class="keyword">const</font> std::vector<CVector> &points, <font class="keywordtype">float</font> &distance, <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &nearPos, <font class="keywordtype">bool</font> isPath) +00720 { +00721 uint32 i; +00722 CVector vMin, vMax; +00723 <font class="keywordtype">float</font> nearest = FLT_MAX; +00724 CVector pos; +00725 +00726 <font class="comment">// Point or line can't contains !</font> +00727 <font class="keywordflow">if</font> (points.size() < 3 || isPath) +00728 { +00729 <font class="comment">// only compute the distance.</font> +00730 <font class="keywordflow">if</font> (points.size() == 1) +00731 { +00732 distance = (points[0] - v).norm(); +00733 nearPos = points[0]; +00734 } +00735 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (points.size() == 2) +00736 { +00737 distance = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, points[0], points[1], nearPos); +00738 } +00739 <font class="keywordflow">else</font> +00740 { +00741 <font class="comment">// compute nearest segment</font> +00742 <font class="keywordflow">for</font> (i = 0; i < points.size()-1; ++i) +00743 { +00744 <font class="keyword">const</font> CVector &p1 = points[i]; +00745 <font class="keyword">const</font> CVector &p2 = points[i+1]; +00746 +00747 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, p1, p2, pos); +00748 <font class="keywordflow">if</font>( dist < nearest) +00749 { +00750 nearest = dist; +00751 nearPos = pos; +00752 } +00753 } +00754 distance = nearest; +00755 } +00756 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00757 } +00758 +00759 <font class="comment">// Get the bounding rectangle of the zone</font> +00760 vMax = vMin = points[0]; +00761 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00762 { +00763 vMin.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> = <a class="code" href="bit__set_8cpp.html#a0">min</a>(vMin.x, points[i].x); +00764 vMin.y = <a class="code" href="bit__set_8cpp.html#a0">min</a>(vMin.y, points[i].y); +00765 vMax.x = max(vMax.x, points[i].x); +00766 vMax.y = max(vMax.y, points[i].y); +00767 } +00768 +00769 <font class="keywordflow">if</font> ((v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> < vMin.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> < vMin.y) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a> > vMax.x) || (v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a> > vMax.y)) +00770 { +00771 <font class="comment">// find the nearest distance of all segment</font> +00772 <font class="keywordflow">for</font> (uint i=0; i<points.size(); ++i) +00773 { +00774 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, points[i], points[(i+1) % points.size()], pos); +00775 +00776 <font class="keywordflow">if</font> (dist < nearest) +00777 { +00778 nearest = dist; +00779 nearPos = pos; +00780 } +00781 } +00782 distance = nearest; +00783 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00784 } +00785 +00786 uint32 nNbIntersection = 0; +00787 <font class="keywordflow">for</font> (i = 0; i < points.size(); ++i) +00788 { +00789 <font class="keyword">const</font> CVector &p1 = points[i]; +00790 <font class="keyword">const</font> CVector &p2 = points[(i+1)%points.size()]; +00791 +00792 <font class="keywordtype">float</font> dist = <a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">getSegmentDist</a>(v, p1, p2, pos); +00793 <font class="keywordflow">if</font>( dist < nearest) +00794 { +00795 nearest = dist; +00796 nearPos = pos; +00797 } +00798 +00799 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) < 0.0)) +00800 <font class="keywordflow">continue</font>; +00801 <font class="keywordflow">if</font> (((p1.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)&&((p2.y-v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>) > 0.0)) +00802 <font class="keywordflow">continue</font>; +00803 <font class="keywordtype">float</font> xinter = p1.x + (p2.x-p1.x) * ((v.<a class="code" href="classNLMISC_1_1CVector.html#m1">y</a>-p1.y)/(p2.y-p1.y)); +00804 <font class="keywordflow">if</font> (xinter > v.<a class="code" href="classNLMISC_1_1CVector.html#m0">x</a>) +00805 ++nNbIntersection; +00806 } +00807 +00808 distance = nearest; +00809 <font class="keywordflow">if</font> ((nNbIntersection&1) == 1) <font class="comment">// odd intersections so the vertex is inside</font> +00810 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00811 <font class="keywordflow">else</font> +00812 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00813 } +00814 +00815 <font class="comment">// ***************************************************************************</font> +00816 +<a name="l00817"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#d0">00817</a> <font class="keywordtype">float</font> CPrimZone::getSegmentDist(<font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> v, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &p1, <font class="keyword">const</font> <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &p2, <a class="code" href="classNLMISC_1_1CVector.html">NLMISC::CVector</a> &nearPos) +00818 { +00819 <font class="comment">// too point, compute distance to the segment.</font> +00820 CVector V = (p2-p1).normed(); +00821 <font class="keywordtype">float</font> <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a> = ((v-p1)*V)/(p2-p1).norm(); +00822 <font class="keywordtype">float</font> distance; +00823 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a> < 0.0f) +00824 { +00825 nearPos = p1; +00826 distance = (p1-v).<a class="code" href="classNLMISC_1_1CVector.html#z331_2">norm</a>(); +00827 } +00828 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a> > 1.0f) +00829 { +00830 nearPos = p2; +00831 distance = (p2-v).<a class="code" href="classNLMISC_1_1CVector.html#z331_2">norm</a>(); +00832 } +00833 <font class="keywordflow">else</font> +00834 { +00835 nearPos = p1 + <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>*(p2-p1); +00836 distance = (v-nearPos).norm(); +00837 } +00838 +00839 <font class="keywordflow">return</font> distance; +00840 } +00841 +00842 +00843 +00844 <font class="comment">// ***************************************************************************</font> +<a name="l00845"></a><a class="code" href="classNLLIGO_1_1CPrimZone.html#a2">00845</a> <font class="keywordtype">void</font> CPrimZone::serial (IStream &f) +00846 { +00847 f.xmlPushBegin (<font class="stringliteral">"ZONE"</font>); +00848 +00849 f.xmlSetAttrib (<font class="stringliteral">"NAME"</font>); +00850 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m1">Name</a>); +00851 f.xmlSetAttrib (<font class="stringliteral">"LAYER"</font>); +00852 f.serial (<a class="code" href="classNLLIGO_1_1IPrimitive.html#m0">Layer</a>); +00853 f.xmlPushEnd (); +00854 +00855 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimZone.html#m0">VPoints</a>); +00856 +00857 f.xmlPop (); +00858 } +00859 +00860 <font class="comment">// ***************************************************************************</font> +<a name="l00861"></a><a class="code" href="classNLLIGO_1_1CPrimRegion.html#a0">00861</a> <font class="keywordtype">void</font> CPrimRegion::serial (IStream &f) +00862 { +00863 f.xmlPushBegin (<font class="stringliteral">"REGION"</font>); +00864 +00865 f.xmlSetAttrib (<font class="stringliteral">"NAME"</font>); +00866 f.serial (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m0">Name</a>); +00867 +00868 f.xmlPushEnd(); +00869 +00870 sint version = 2; +00871 version = f.serialVersion (version); +00872 string check = <font class="stringliteral">"REGION"</font>; +00873 f.serialCheck (check); +00874 +00875 f.xmlPush (<font class="stringliteral">"POINTS"</font>); +00876 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m1">VPoints</a>); +00877 f.xmlPop (); +00878 f.xmlPush (<font class="stringliteral">"PATHES"</font>); +00879 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m3">VPaths</a>); +00880 f.xmlPop (); +00881 f.xmlPush (<font class="stringliteral">"ZONES"</font>); +00882 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m2">VZones</a>); +00883 f.xmlPop (); +00884 +00885 <font class="keywordflow">if</font> (version > 1) +00886 { +00887 f.xmlPush (<font class="stringliteral">"HIDEPOINTS"</font>); +00888 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m4">VHidePoints</a>); +00889 f.xmlPop (); +00890 f.xmlPush (<font class="stringliteral">"HIDEZONES"</font>); +00891 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m5">VHideZones</a>); +00892 f.xmlPop (); +00893 f.xmlPush (<font class="stringliteral">"HIDEPATHS"</font>); +00894 f.serialCont (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m6">VHidePaths</a>); +00895 f.xmlPop (); +00896 } +00897 <font class="keywordflow">else</font> +00898 { +00899 <a class="code" href="classNLLIGO_1_1CPrimRegion.html#m4">VHidePoints</a>.resize (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m1">VPoints</a>.size(), <font class="keyword">false</font>); +00900 <a class="code" href="classNLLIGO_1_1CPrimRegion.html#m5">VHideZones</a>.resize (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m2">VZones</a>.size(), <font class="keyword">false</font>); +00901 <a class="code" href="classNLLIGO_1_1CPrimRegion.html#m6">VHidePaths</a>.resize (<a class="code" href="classNLLIGO_1_1CPrimRegion.html#m3">VPaths</a>.size(), <font class="keyword">false</font>); +00902 } +00903 } +00904 +00905 <font class="comment">// ***************************************************************************</font> +00906 <font class="comment">// IPrimitive</font> +00907 <font class="comment">// ***************************************************************************</font> +00908 +<a name="l00909"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a2">00909</a> IPrimitive::IPrimitive (<font class="keyword">const</font> IPrimitive &node) +00910 { +00911 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o0">_Parent</a> = NULL; +00912 IPrimitive::operator= (node); +00913 } +00914 +00915 <font class="comment">// ***************************************************************************</font> +00916 +<a name="l00917"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a3">00917</a> IPrimitive* IPrimitive::copy ()<font class="keyword"> const</font> +00918 <font class="keyword"></font>{ +00919 <font class="comment">// What is this primitive ?</font> +00920 +00921 <font class="comment">// The copy</font> +00922 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a0">IPrimitive</a> *theCopy; +00923 +00924 <font class="comment">// Is it a prim node ?</font> +00925 <font class="keyword">const</font> CPrimNode *primNode = dynamic_cast<const CPrimNode*>(this); +00926 <font class="keywordflow">if</font> (primNode) +00927 { +00928 theCopy = <font class="keyword">new</font> CPrimNode; +00929 *(CPrimNode*)theCopy = *(<font class="keyword">const</font> CPrimNode*)<font class="keyword">this</font>; +00930 } +00931 <font class="keywordflow">else</font> +00932 { +00933 <font class="comment">// Is it a point node ?</font> +00934 <font class="keyword">const</font> CPrimPoint *pointNode = dynamic_cast<const CPrimPoint*>(this); +00935 <font class="keywordflow">if</font> (pointNode) +00936 { +00937 theCopy = <font class="keyword">new</font> CPrimPoint; +00938 *(CPrimPoint*)theCopy = *(<font class="keyword">const</font> CPrimPoint*)<font class="keyword">this</font>; +00939 } +00940 <font class="keywordflow">else</font> +00941 { +00942 <font class="comment">// Is it a path node ?</font> +00943 <font class="keyword">const</font> CPrimPath *pathNode = dynamic_cast<const CPrimPath*>(this); +00944 <font class="keywordflow">if</font> (pathNode) +00945 { +00946 theCopy = <font class="keyword">new</font> CPrimPath; +00947 *(CPrimPath*)theCopy = *(<font class="keyword">const</font> CPrimPath*)<font class="keyword">this</font>; +00948 } +00949 <font class="keywordflow">else</font> +00950 { +00951 <font class="comment">// Is it a path node ?</font> +00952 <font class="keyword">const</font> CPrimZone *zoneNode = dynamic_cast<const CPrimZone*>(this); +00953 <a class="code" href="debug_8h.html#a9">nlverify</a> (zoneNode); +00954 theCopy = <font class="keyword">new</font> CPrimZone; +00955 *(CPrimZone*)theCopy = *(<font class="keyword">const</font> CPrimZone*)<font class="keyword">this</font>; +00956 } +00957 } +00958 } +00959 +00960 +00961 <font class="comment">// Copy children</font> +00962 theCopy->_Children.resize (<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()); +00963 <font class="keywordflow">for</font> (uint child = 0; child < <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size (); child++) +00964 { +00965 <font class="comment">// Copy the child</font> +00966 theCopy->_Children[child] = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[child]->copy (); +00967 +00968 <font class="comment">// Set the parent</font> +00969 theCopy->_Children[child]->_Parent = theCopy; +00970 } +00971 +00972 <font class="comment">// Copy properties</font> +00973 std::map<std::string, IProperty*>::const_iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +00974 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +00975 { +00976 <font class="comment">// Get the property</font> +00977 CPropertyString *propString = dynamic_cast<CPropertyString *>(ite->second); +00978 <font class="keywordflow">if</font> (propString) +00979 { +00980 <font class="comment">// New property</font> +00981 CPropertyString *newProp = <font class="keyword">new</font> CPropertyString (); +00982 *newProp = *propString; +00983 theCopy->_Properties.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +00984 } +00985 <font class="keywordflow">else</font> +00986 { +00987 CPropertyStringArray *propStringArray = dynamic_cast<CPropertyStringArray *>(ite->second); +00988 <font class="keywordflow">if</font> (propStringArray) +00989 { +00990 <font class="comment">// New property</font> +00991 CPropertyStringArray *newProp = <font class="keyword">new</font> CPropertyStringArray (); +00992 *newProp = *propStringArray; +00993 theCopy->_Properties.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +00994 } +00995 <font class="keywordflow">else</font> +00996 { +00997 CPropertyColor *propColor = dynamic_cast<CPropertyColor *>(ite->second); +00998 <a class="code" href="debug_8h.html#a9">nlverify</a> (propColor); +00999 +01000 <font class="comment">// New property</font> +01001 CPropertyColor *newProp = <font class="keyword">new</font> CPropertyColor (); +01002 *newProp = *propColor; +01003 theCopy->_Properties.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +01004 } +01005 } +01006 +01007 ite++; +01008 } +01009 +01010 <font class="keywordflow">return</font> theCopy; +01011 } +01012 +01013 <font class="comment">// ***************************************************************************</font> +01014 +<a name="l01015"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a4">01015</a> <font class="keywordtype">void</font> IPrimitive::operator= (<font class="keyword">const</font> IPrimitive &node) +01016 { +01017 <font class="comment">// Clean dest</font> +01018 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a12">removeChildren</a> (); +01019 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a27">removeProperties</a> (); +01020 +01021 <font class="comment">// Copy children</font> +01022 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.resize (node._Children.size ()); +01023 <font class="keywordflow">for</font> (uint child = 0; child < node._Children.size (); child++) +01024 { +01025 <font class="comment">// Copy the child</font> +01026 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[child] = node._Children[child]->copy (); +01027 +01028 <font class="comment">// Set the parent</font> +01029 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[child]->_Parent = <font class="keyword">this</font>; +01030 } +01031 +01032 <font class="comment">// Copy properties</font> +01033 std::map<std::string, IProperty*>::const_iterator ite = node._Properties.begin (); +01034 <font class="keywordflow">while</font> (ite != node._Properties.end ()) +01035 { +01036 <font class="comment">// Get the property</font> +01037 CPropertyString *propString = dynamic_cast<CPropertyString *>(ite->second); +01038 <font class="keywordflow">if</font> (propString) +01039 { +01040 <font class="comment">// New property</font> +01041 CPropertyString *newProp = <font class="keyword">new</font> CPropertyString (); +01042 *newProp = *propString; +01043 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +01044 } +01045 <font class="keywordflow">else</font> +01046 { +01047 CPropertyStringArray *propStringArray = dynamic_cast<CPropertyStringArray *>(ite->second); +01048 <font class="keywordflow">if</font> (propStringArray) +01049 { +01050 <font class="comment">// New property</font> +01051 CPropertyStringArray *newProp = <font class="keyword">new</font> CPropertyStringArray (); +01052 *newProp = *propStringArray; +01053 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +01054 } +01055 <font class="keywordflow">else</font> +01056 { +01057 CPropertyColor *propColor = dynamic_cast<CPropertyColor *>(ite->second); +01058 <a class="code" href="debug_8h.html#a9">nlverify</a> (propColor); +01059 +01060 <font class="comment">// New property</font> +01061 CPropertyColor *newProp = <font class="keyword">new</font> CPropertyColor (); +01062 *newProp = *propColor; +01063 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.insert (std::map<std::string, IProperty*>::value_type (ite->first, newProp)); +01064 } +01065 } +01066 +01067 ite++; +01068 } +01069 } +01070 +01071 <font class="comment">// ***************************************************************************</font> +01072 +<a name="l01073"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a15">01073</a> <font class="keywordtype">bool</font> IPrimitive::getProperty (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, std::string &property_name, <font class="keyword">const</font> IProperty *&result)<font class="keyword"> const</font> +01074 <font class="keyword"></font>{ +01075 <font class="comment">// Look for the property</font> +01076 std::map<std::string, IProperty*>::const_iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +01077 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01078 { +01079 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == 0) +01080 { +01081 property_name = ite->first; +01082 result = ite->second; +01083 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01084 } +01085 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>--; +01086 ite ++; +01087 } +01088 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getProperty : invalid index (index : %d, size : %d)."</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.size ()); +01089 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01090 } +01091 +01092 <font class="comment">// ***************************************************************************</font> +01093 +<a name="l01094"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a16">01094</a> <font class="keywordtype">bool</font> IPrimitive::getProperty (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, std::string &property_name, IProperty *&result) +01095 { +01096 <font class="comment">// Look for the property</font> +01097 std::map<std::string, IProperty*>::iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +01098 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01099 { +01100 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == 0) +01101 { +01102 property_name = ite->first; +01103 result = ite->second; +01104 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01105 } +01106 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>--; +01107 ite ++; +01108 } +01109 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getProperty : invalid index (index : %d, size : %d)."</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.size ()); +01110 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01111 } +01112 +01113 <font class="comment">// ***************************************************************************</font> +01114 +<a name="l01115"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">01115</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, <font class="keyword">const</font> IProperty *&result)<font class="keyword"> const</font> +01116 <font class="keyword"></font>{ +01117 <font class="comment">// Look for the property</font> +01118 std::map<std::string, IProperty*>::const_iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.find (property_name); +01119 <font class="keywordflow">if</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01120 { +01121 result = ite->second; +01122 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01123 } +01124 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01125 } +01126 +01127 <font class="comment">// ***************************************************************************</font> +01128 +<a name="l01129"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a19">01129</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, IProperty *&result) +01130 { +01131 <font class="comment">// Look for the property</font> +01132 std::map<std::string, IProperty*>::iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.find (property_name); +01133 <font class="keywordflow">if</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01134 { +01135 result = ite->second; +01136 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01137 } +01138 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01139 } +01140 +01141 <font class="comment">// ***************************************************************************</font> +01142 +<a name="l01143"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a20">01143</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, std::string *&result) +01144 { +01145 <font class="comment">// Get the property</font> +01146 IProperty *prop; +01147 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">getPropertyByName</a> (property_name, prop)) +01148 { +01149 CPropertyString *strProp = dynamic_cast<CPropertyString *> (prop); +01150 <font class="keywordflow">if</font> (strProp) +01151 { +01152 result = &(strProp->String); +01153 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01154 } +01155 <font class="keywordflow">else</font> +01156 { +01157 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getPropertyByName : property (%s) in not a string."</font>, property_name); +01158 } +01159 } +01160 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01161 } +01162 +01163 <font class="comment">// ***************************************************************************</font> +01164 +<a name="l01165"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a22">01165</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, std::string &result)<font class="keyword"> const</font> +01166 <font class="keyword"></font>{ +01167 <font class="comment">// Get the property</font> +01168 <font class="keyword">const</font> IProperty *prop; +01169 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">getPropertyByName</a> (property_name, prop)) +01170 { +01171 <font class="keyword">const</font> CPropertyString *strProp = dynamic_cast<const CPropertyString *> (prop); +01172 <font class="keywordflow">if</font> (strProp) +01173 { +01174 result = strProp->String; +01175 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01176 } +01177 <font class="keywordflow">else</font> +01178 { +01179 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getPropertyByName : property (%s) in not a string."</font>, property_name); +01180 } +01181 } +01182 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01183 } +01184 +01185 <font class="comment">// ***************************************************************************</font> +01186 +<a name="l01187"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a21">01187</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, std::vector<std::string> *&result) +01188 { +01189 <font class="comment">// Get the property</font> +01190 IProperty *prop; +01191 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">getPropertyByName</a> (property_name, prop)) +01192 { +01193 CPropertyStringArray *strProp = dynamic_cast<CPropertyStringArray *> (prop); +01194 <font class="keywordflow">if</font> (strProp) +01195 { +01196 result = &(strProp->StringArray); +01197 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01198 } +01199 <font class="keywordflow">else</font> +01200 { +01201 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getPropertyByName : property (%s) in not a string."</font>, property_name); +01202 } +01203 } +01204 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01205 } +01206 +01207 <font class="comment">// ***************************************************************************</font> +01208 +<a name="l01209"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a23">01209</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, <font class="keyword">const</font> std::vector<std::string> *&result)<font class="keyword"> const</font> +01210 <font class="keyword"></font>{ +01211 <font class="comment">// Get the property</font> +01212 IProperty *prop; +01213 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">getPropertyByName</a> (property_name, prop)) +01214 { +01215 <font class="keyword">const</font> CPropertyStringArray *strProp = dynamic_cast<const CPropertyStringArray *> (prop); +01216 <font class="keywordflow">if</font> (strProp) +01217 { +01218 result = &(strProp->StringArray); +01219 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01220 } +01221 <font class="keywordflow">else</font> +01222 { +01223 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getPropertyByName : property (%s) in not a string."</font>, property_name); +01224 } +01225 } +01226 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01227 } +01228 +01229 <font class="comment">// ***************************************************************************</font> +01230 +<a name="l01231"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a24">01231</a> <font class="keywordtype">bool</font> IPrimitive::getPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> &result)<font class="keyword"> const</font> +01232 <font class="keyword"></font>{ +01233 <font class="comment">// Get the property</font> +01234 IProperty *prop; +01235 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#a18">getPropertyByName</a> (property_name, prop)) +01236 { +01237 <font class="keyword">const</font> CPropertyColor *colorProp = dynamic_cast<const CPropertyColor *> (prop); +01238 <font class="keywordflow">if</font> (colorProp) +01239 { +01240 result = colorProp->Color; +01241 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01242 } +01243 <font class="keywordflow">else</font> +01244 { +01245 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getPropertyByName : property (%s) in not a color."</font>, property_name); +01246 } +01247 } +01248 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01249 } +01250 +01251 <font class="comment">// ***************************************************************************</font> +01252 +<a name="l01253"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a25">01253</a> <font class="keywordtype">bool</font> IPrimitive::removeProperty (uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +01254 { +01255 <font class="comment">// Look for the property</font> +01256 std::map<std::string, IProperty*>::iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +01257 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01258 { +01259 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == 0) +01260 { +01261 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.erase (ite); +01262 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01263 } +01264 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>--; +01265 ite ++; +01266 } +01267 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::removeProperty : invalid index (index : %d, size : %d)."</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.size ()); +01268 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01269 } +01270 +01271 <font class="comment">// ***************************************************************************</font> +01272 +<a name="l01273"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a26">01273</a> <font class="keywordtype">bool</font> IPrimitive::removePropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name) +01274 { +01275 <font class="comment">// Look for the property</font> +01276 std::map<std::string, IProperty*>::iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.find (property_name); +01277 <font class="keywordflow">if</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01278 { +01279 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.erase (ite); +01280 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01281 } +01282 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01283 } +01284 +01285 <font class="comment">// ***************************************************************************</font> +01286 +<a name="l01287"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a27">01287</a> <font class="keywordtype">void</font> IPrimitive::removeProperties () +01288 { +01289 std::map<std::string, IProperty*>::iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +01290 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01291 { +01292 <font class="keyword">delete</font> ite->second; +01293 ite++; +01294 } +01295 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.clear (); +01296 } +01297 +01298 <font class="comment">// ***************************************************************************</font> +01299 +<a name="l01300"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a6">01300</a> <font class="keywordtype">bool</font> IPrimitive::getChild (<font class="keyword">const</font> IPrimitive *&result, uint childId)<font class="keyword"> const</font> +01301 <font class="keyword"></font>{ +01302 <font class="keywordflow">if</font> (childId < <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()) +01303 { +01304 result = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[childId]; +01305 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01306 } +01307 <font class="keywordflow">else</font> +01308 { +01309 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getChild : invalid index (index : %d, size %d)."</font>, childId, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()); +01310 } +01311 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01312 } +01313 +01314 <font class="comment">// ***************************************************************************</font> +01315 +<a name="l01316"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a7">01316</a> <font class="keywordtype">bool</font> IPrimitive::getChild (IPrimitive *&result, uint childId) +01317 { +01318 <font class="keywordflow">if</font> (childId < <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()) +01319 { +01320 result = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[childId]; +01321 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01322 } +01323 <font class="keywordflow">else</font> +01324 { +01325 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::getChild : invalid index (index : %d, size %d)."</font>, childId, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()); +01326 } +01327 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01328 } +01329 +01330 <font class="comment">// ***************************************************************************</font> +01331 +<a name="l01332"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a11">01332</a> <font class="keywordtype">bool</font> IPrimitive::removeChild (uint childId) +01333 { +01334 <font class="keywordflow">if</font> (childId < <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()) +01335 { +01336 <font class="keyword">delete</font> <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[childId]; +01337 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.erase (<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.begin()+childId); +01338 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01339 } +01340 <font class="keywordflow">else</font> +01341 { +01342 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"NLLIGO::IPrimitive::removeChild : invalid index (index : %d, size %d)."</font>, childId, <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()); +01343 } +01344 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01345 } +01346 +01347 <font class="comment">// ***************************************************************************</font> +01348 +<a name="l01349"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a12">01349</a> <font class="keywordtype">void</font> IPrimitive::removeChildren () +01350 { +01351 <font class="comment">// Erase children</font> +01352 <font class="keywordflow">for</font> (uint i=0; i<<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size (); i++) +01353 { +01354 <font class="keyword">delete</font> <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[i]; +01355 } +01356 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.clear (); +01357 } +01358 +01359 <font class="comment">// ***************************************************************************</font> +01360 +<a name="l01361"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a13">01361</a> <font class="keywordtype">bool</font> IPrimitive::insertChild (IPrimitive *primitive, uint <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>) +01362 { +01363 <font class="comment">// At the end ?</font> +01364 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> == <a class="code" href="classNLLIGO_1_1IPrimitive.html#s2s1">AtTheEnd</a>) +01365 <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a> = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size (); +01366 +01367 <font class="comment">// Index valid ?</font> +01368 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>><a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size ()) +01369 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01370 +01371 <font class="comment">// Insert</font> +01372 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.insert (<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.begin () + <a class="code" href="driver__opengl__extension__def_8h.html#a358">index</a>, primitive); +01373 +01374 <font class="comment">// Link to the parent</font> +01375 primitive->_Parent = <font class="keyword">this</font>; +01376 +01377 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01378 } +01379 +01380 <font class="comment">// ***************************************************************************</font> +01381 +<a name="l01382"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a1">01382</a> IPrimitive::~IPrimitive () +01383 { +01384 <font class="comment">// Remove children</font> +01385 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a12">removeChildren</a> (); +01386 +01387 <font class="comment">// Erase properties</font> +01388 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a27">removeProperties</a> (); +01389 } +01390 +01391 <font class="comment">// ***************************************************************************</font> +01392 +<a name="l01393"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a17">01393</a> <font class="keywordtype">bool</font> IPrimitive::addPropertyByName (<font class="keyword">const</font> <font class="keywordtype">char</font> *property_name, IProperty *result) +01394 { +01395 <font class="keywordtype">bool</font> inserted = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.insert (std::map<std::string, IProperty*>::value_type (property_name, result)).second; +01396 <font class="keywordflow">if</font> (inserted) +01397 { +01398 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01399 } +01400 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01401 } +01402 +01403 <font class="comment">// ***************************************************************************</font> +01404 +<a name="l01405"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a28">01405</a> <font class="keywordtype">bool</font> IPrimitive::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename, uint version) +01406 { +01407 <font class="comment">// Erase old properties</font> +01408 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.clear (); +01409 +01410 <font class="comment">// Read the properties</font> +01411 xmlNodePtr propNode; +01412 propNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"PROPERTY"</font>); +01413 <font class="keywordflow">if</font> (propNode) +01414 { +01415 <font class="keywordflow">do</font> +01416 { +01417 <font class="comment">// Read the name</font> +01418 string name; +01419 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a10">GetNodeString</a> (name, filename, propNode, <font class="stringliteral">"NAME"</font>)) +01420 { +01421 <font class="comment">// Get the property type</font> +01422 string <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>; +01423 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>, filename, propNode, <font class="stringliteral">"TYPE"</font>)) +01424 { +01425 <font class="comment">// The property</font> +01426 IProperty *property = NULL; +01427 +01428 <font class="comment">// Check the type</font> +01429 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"string"</font>) +01430 { +01431 <font class="comment">// Create a new property</font> +01432 CPropertyString *propertyString = <font class="keyword">new</font> CPropertyString; +01433 property = propertyString; +01434 +01435 <font class="comment">// Read it</font> +01436 <font class="keywordflow">if</font> (!<a class="code" href="namespaceNLLIGO.html#a10">GetNodeString</a> (propertyString->String, filename, propNode, <font class="stringliteral">"STRING"</font>)) +01437 { +01438 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01439 } +01440 } +01441 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"string_array"</font>) +01442 { +01443 <font class="comment">// Create a new property</font> +01444 CPropertyStringArray *propertyStringArray = <font class="keyword">new</font> CPropertyStringArray; +01445 property = propertyStringArray; +01446 +01447 <font class="comment">// Read strings</font> +01448 xmlNodePtr stringNode; +01449 propertyStringArray->StringArray.reserve (CIXml::countChildren (xmlNode, <font class="stringliteral">"STRING"</font>)); +01450 stringNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"STRING"</font>); +01451 <font class="keywordflow">if</font> (stringNode) +01452 { +01453 <font class="keywordflow">do</font> +01454 { +01455 <font class="comment">// Add the string</font> +01456 string content; +01457 <a class="code" href="namespaceNLLIGO.html#a11">GetContentString</a> (content, filename, stringNode); +01458 propertyStringArray->StringArray.push_back (content); +01459 } +01460 <font class="keywordflow">while</font> ((stringNode = CIXml::getNextChildNode (stringNode, <font class="stringliteral">"STRING"</font>))); +01461 } +01462 } +01463 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"color"</font>) +01464 { +01465 <font class="comment">// Create a new property</font> +01466 CPropertyColor *propertyColor= <font class="keyword">new</font> CPropertyColor; +01467 property = propertyColor; +01468 +01469 <font class="comment">// Read strings</font> +01470 xmlNodePtr colorNode; +01471 colorNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"COLOR"</font>); +01472 string R, G, B, A; +01473 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (R, filename, colorNode, <font class="stringliteral">"R"</font>) && +01474 <a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (G, filename, colorNode, <font class="stringliteral">"G"</font>) && +01475 <a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (B, filename, colorNode, <font class="stringliteral">"B"</font>) && +01476 <a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (A, filename, colorNode, <font class="stringliteral">"A"</font>)) +01477 { +01478 sint32 sR=0, sG=0, sB=0, sA=255; +01479 sR = atoi (R.c_str ()); +01480 <a class="code" href="namespaceNLMISC.html#a215">clamp</a> (sR, 0, 255); +01481 sG = atoi (G.c_str ()); +01482 <a class="code" href="namespaceNLMISC.html#a215">clamp</a> (sG, 0, 255); +01483 sB = atoi (B.c_str ()); +01484 <a class="code" href="namespaceNLMISC.html#a215">clamp</a> (sB, 0, 255); +01485 sA = atoi (A.c_str ()); +01486 <a class="code" href="namespaceNLMISC.html#a215">clamp</a> (sR, 0, 255); +01487 propertyColor->Color.R = (uint8)sR; +01488 propertyColor->Color.G = (uint8)sG; +01489 propertyColor->Color.B = (uint8)sB; +01490 propertyColor->Color.A = (uint8)sA; +01491 } +01492 <font class="keywordflow">else</font> +01493 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01494 } +01495 +01496 <font class="comment">// Property found ?</font> +01497 <font class="keywordflow">if</font> (property == NULL) +01498 { +01499 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (propNode, filename, <font class="stringliteral">"IPrimitive::read : Unknown property type (%s)"</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>.c_str ()); +01500 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01501 } +01502 +01503 <font class="comment">// Add it</font> +01504 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.insert (std::map<std::string, IProperty*>::value_type (name, property)); +01505 } +01506 <font class="keywordflow">else</font> +01507 { +01508 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01509 } +01510 } +01511 <font class="keywordflow">else</font> +01512 { +01513 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01514 } +01515 } +01516 <font class="keywordflow">while</font> (propNode = CIXml::getNextChildNode (propNode, <font class="stringliteral">"PROPERTY"</font>)); +01517 } +01518 +01519 <font class="comment">// Read children</font> +01520 xmlNodePtr childNode; +01521 childNode = CIXml::getFirstChildNode (xmlNode, <font class="stringliteral">"CHILD"</font>); +01522 <font class="keywordflow">if</font> (childNode) +01523 { +01524 <font class="keywordflow">do</font> +01525 { +01526 <font class="comment">// Get the property class</font> +01527 string <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>; +01528 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>, filename, childNode, <font class="stringliteral">"TYPE"</font>)) +01529 { +01530 <font class="comment">// Primitive</font> +01531 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a0">IPrimitive</a> *primitive = NULL; +01532 +01533 <font class="comment">// Check the type</font> +01534 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"node"</font>) +01535 { +01536 <font class="comment">// Create new primitive</font> +01537 primitive = <font class="keyword">new</font> CPrimNode; +01538 } +01539 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"point"</font>) +01540 { +01541 <font class="comment">// Create new primitive</font> +01542 primitive = <font class="keyword">new</font> CPrimPoint; +01543 } +01544 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"path"</font>) +01545 { +01546 <font class="comment">// Create new primitive</font> +01547 primitive = <font class="keyword">new</font> CPrimPath; +01548 } +01549 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a> == <font class="stringliteral">"zone"</font>) +01550 { +01551 <font class="comment">// Create new primitive</font> +01552 primitive = <font class="keyword">new</font> CPrimZone; +01553 } +01554 +01555 <font class="comment">// Primitive type not found ?</font> +01556 <font class="keywordflow">if</font> (primitive == NULL) +01557 { +01558 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (childNode, filename, <font class="stringliteral">"IPrimitive::read : Unknown primitive type (%s)"</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a373">type</a>.c_str ()); +01559 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01560 } +01561 +01562 <font class="comment">// Read it</font> +01563 primitive->read (childNode, filename, version); +01564 +01565 <font class="comment">// Add it</font> +01566 <a class="code" href="classNLLIGO_1_1IPrimitive.html#a13">insertChild</a> (primitive); +01567 } +01568 <font class="keywordflow">else</font> +01569 { +01570 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01571 } +01572 } +01573 <font class="keywordflow">while</font> (childNode = CIXml::getNextChildNode (childNode, <font class="stringliteral">"CHILD"</font>)); +01574 } +01575 +01576 <font class="comment">// Done</font> +01577 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01578 } +01579 +01580 <font class="comment">// ***************************************************************************</font> +01581 +<a name="l01582"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a29">01582</a> <font class="keywordtype">void</font> IPrimitive::write (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +01583 <font class="keyword"></font>{ +01584 <font class="comment">// Save the properties</font> +01585 std::map<std::string, IProperty*>::const_iterator ite = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.begin (); +01586 <font class="keywordflow">while</font> (ite != <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.end ()) +01587 { +01588 <font class="comment">// Create new nodes</font> +01589 xmlNodePtr propNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"PROPERTY"</font>, NULL); +01590 xmlNodePtr nameNode = xmlNewChild ( propNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"NAME"</font>, NULL); +01591 xmlNodePtr textNode = xmlNewText ((<font class="keyword">const</font> xmlChar *)(ite->first.c_str ())); +01592 xmlAddChild (nameNode, textNode); +01593 +01594 <font class="comment">// Type</font> +01595 <font class="keyword">const</font> CPropertyString *str = dynamic_cast<const CPropertyString *> (ite->second); +01596 <font class="keywordflow">if</font> (str) +01597 { +01598 <font class="comment">// Set the type</font> +01599 xmlSetProp (propNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"string"</font>); +01600 +01601 <font class="comment">// Create new nodes</font> +01602 xmlNodePtr stringNode = xmlNewChild ( propNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"STRING"</font>, NULL); +01603 xmlNodePtr textNode = xmlNewText ((<font class="keyword">const</font> xmlChar *)(str->String.c_str ())); +01604 xmlAddChild (stringNode, textNode); +01605 } +01606 <font class="keywordflow">else</font> +01607 { +01608 <font class="comment">// Should be an array</font> +01609 <font class="keyword">const</font> CPropertyStringArray *array = dynamic_cast<const CPropertyStringArray *> (ite->second); +01610 <font class="keywordflow">if</font> (array) +01611 { +01612 <font class="comment">// Set the type</font> +01613 xmlSetProp (propNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"string_array"</font>); +01614 +01615 <font class="comment">// For each strings in the array</font> +01616 <font class="keywordflow">for</font> (uint i=0; i<array->StringArray.size (); i++) +01617 { +01618 <font class="comment">// Create new nodes</font> +01619 xmlNodePtr stringNode = xmlNewChild ( propNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"STRING"</font>, NULL); +01620 xmlNodePtr textNode = xmlNewText ((<font class="keyword">const</font> xmlChar *)(array->StringArray[i].c_str ())); +01621 xmlAddChild (stringNode, textNode); +01622 } +01623 } +01624 <font class="keywordflow">else</font> +01625 { +01626 <font class="comment">// Should be a color</font> +01627 <font class="keyword">const</font> CPropertyColor *color = safe_cast<const CPropertyColor *> (ite->second); +01628 +01629 <font class="comment">// Set the type</font> +01630 xmlSetProp (propNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"TYPE"</font>, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"color"</font>); +01631 +01632 <font class="comment">// Create new nodes</font> +01633 xmlNodePtr colorNode = xmlNewChild ( propNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"COLOR"</font>, NULL); +01634 xmlSetProp (colorNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"R"</font>, (<font class="keyword">const</font> xmlChar*)toString (color->Color.R).c_str ()); +01635 xmlSetProp (colorNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"G"</font>, (<font class="keyword">const</font> xmlChar*)toString (color->Color.G).c_str ()); +01636 xmlSetProp (colorNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"B"</font>, (<font class="keyword">const</font> xmlChar*)toString (color->Color.B).c_str ()); +01637 xmlSetProp (colorNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"A"</font>, (<font class="keyword">const</font> xmlChar*)toString (color->Color.A).c_str ()); +01638 } +01639 } +01640 +01641 ite++; +01642 } +01643 +01644 <font class="comment">// Save the children</font> +01645 <font class="keywordflow">for</font> (uint i=0; i<<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size (); i++) +01646 { +01647 <font class="comment">// New node</font> +01648 xmlNodePtr childNode = xmlNewChild ( xmlNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"CHILD"</font>, NULL); +01649 +01650 <font class="comment">// Write it</font> +01651 <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[i]->write (childNode, filename); +01652 } +01653 } +01654 +01655 <font class="comment">// ***************************************************************************</font> +01656 +<a name="l01657"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a10">01657</a> <font class="keywordtype">bool</font> IPrimitive::getChildId (uint &childId, <font class="keyword">const</font> IPrimitive *child)<font class="keyword"> const</font> +01658 <font class="keyword"></font>{ +01659 <font class="keyword">const</font> uint childrenSize = <a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>.size (); +01660 <font class="keywordflow">for</font> (uint i=0; i<childrenSize; i++) +01661 { +01662 <font class="keywordflow">if</font> (<a class="code" href="classNLLIGO_1_1IPrimitive.html#o1">_Children</a>[i] == child) +01663 { +01664 childId = i; +01665 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01666 } +01667 } +01668 childId = 0xffffffff; +01669 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01670 } +01671 +01672 <font class="comment">// ***************************************************************************</font> +01673 +<a name="l01674"></a><a class="code" href="classNLLIGO_1_1IPrimitive.html#a14">01674</a> uint IPrimitive::getNumProperty ()<font class="keyword"> const </font> +01675 <font class="keyword"></font>{ +01676 <font class="keywordflow">return</font> <a class="code" href="classNLLIGO_1_1IPrimitive.html#o2">_Properties</a>.size (); +01677 } +01678 +01679 <font class="comment">// ***************************************************************************</font> +01680 <font class="comment">// CPrimitives</font> +01681 <font class="comment">// ***************************************************************************</font> +01682 +<a name="l01683"></a><a class="code" href="classNLLIGO_1_1CPrimitives.html#a1">01683</a> <font class="keywordtype">bool</font> CPrimitives::read (xmlNodePtr xmlNode, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename) +01684 { +01685 <a class="code" href="debug_8h.html#a6">nlassert</a> (xmlNode); +01686 +01687 <font class="comment">// Get the name</font> +01688 <font class="keywordflow">if</font> (strcmp ((<font class="keyword">const</font> <font class="keywordtype">char</font>*)xmlNode->name, <font class="stringliteral">"PRIMITIVES"</font>) == 0) +01689 { +01690 <font class="comment">// Get the version</font> +01691 string versionName = <font class="stringliteral">"0"</font>; +01692 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLLIGO.html#a5">GetPropertyString</a> (versionName, filename, xmlNode, <font class="stringliteral">"VERSION"</font>)) +01693 { +01694 <font class="comment">// Get the version</font> +01695 uint version = atoi (versionName.c_str ()); +01696 +01697 <font class="comment">// Check the version</font> +01698 <font class="keywordflow">if</font> (version <= <a class="code" href="primitive_8cpp.html#a0">NLLIGO_PRIMITVE_VERSION</a>) +01699 { +01700 <font class="comment">// Read the primitives</font> +01701 xmlNode = <a class="code" href="namespaceNLLIGO.html#a4">GetFirstChildNode</a> (xmlNode, filename, <font class="stringliteral">"ROOT_PRIMITIVE"</font>); +01702 <font class="keywordflow">if</font> (xmlNode) +01703 { +01704 <font class="comment">// Read the primitive tree</font> +01705 ((IPrimitive*)&<a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>)->read (xmlNode, filename, version); +01706 } +01707 } +01708 <font class="keywordflow">else</font> +01709 { +01710 <a class="code" href="namespaceNLLIGO.html#a2">Error</a> (filename, <font class="stringliteral">"CPrimitives::read : Unknown file version (%d)"</font>, version); +01711 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01712 } +01713 } +01714 <font class="keywordflow">else</font> +01715 { +01716 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01717 } +01718 } +01719 <font class="keywordflow">else</font> +01720 { +01721 <a class="code" href="namespaceNLLIGO.html#a3">XMLError</a> (xmlNode, filename, <font class="stringliteral">"This XML document is not a NeL primitive file"</font>); +01722 <font class="keywordflow">return</font> <font class="keyword">false</font>; +01723 } +01724 +01725 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01726 } +01727 +01728 <font class="comment">// ***************************************************************************</font> +01729 +<a name="l01730"></a><a class="code" href="classNLLIGO_1_1CPrimitives.html#a2">01730</a> <font class="keywordtype">void</font> CPrimitives::write (xmlDocPtr doc, <font class="keyword">const</font> <font class="keywordtype">char</font> *filename)<font class="keyword"> const</font> +01731 <font class="keyword"></font>{ +01732 <a class="code" href="debug_8h.html#a6">nlassert</a> (doc); +01733 +01734 <font class="comment">// Primitive node</font> +01735 xmlNodePtr primNode = xmlNewDocNode (doc, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"PRIMITIVES"</font>, NULL); +01736 xmlDocSetRootElement (doc, primNode); +01737 +01738 <font class="comment">// Version node</font> +01739 xmlSetProp (primNode, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"VERSION"</font>, (<font class="keyword">const</font> xmlChar*)toString (NLLIGO_PRIMITVE_VERSION).c_str ()); +01740 +01741 <font class="comment">// The primitive root node</font> +01742 xmlNodePtr nameNode = xmlNewChild ( primNode, NULL, (<font class="keyword">const</font> xmlChar*)<font class="stringliteral">"ROOT_PRIMITIVE"</font>, NULL); +01743 +01744 <font class="comment">// Write the primitive tree</font> +01745 ((IPrimitive*)&<a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>)->write (nameNode, filename); +01746 } +01747 +01748 <font class="comment">// ***************************************************************************</font> +01749 +<a name="l01750"></a><a class="code" href="classNLLIGO_1_1CPrimitives.html#c0">01750</a> <font class="keywordtype">void</font> CPrimitives::convertAddPrimitive (IPrimitive *child, <font class="keyword">const</font> IPrimitive *prim, <font class="keywordtype">bool</font> hidden) +01751 { +01752 <font class="comment">// The primitve</font> +01753 IPrimitive *primitive = NULL; +01754 +01755 <font class="comment">// What kind of primitive ?</font> +01756 <font class="keyword">const</font> CPrimPoint *oldPoint = dynamic_cast<const CPrimPoint *>(prim); +01757 <font class="keywordflow">if</font> (oldPoint) +01758 { +01759 <font class="comment">// Create a primitive</font> +01760 CPrimPoint *point = <font class="keyword">new</font> CPrimPoint (); +01761 primitive = point; +01762 +01763 <font class="comment">// Copy it</font> +01764 *point = *oldPoint; +01765 } +01766 <font class="keywordflow">else</font> +01767 { +01768 <font class="comment">// Path ?</font> +01769 <font class="keyword">const</font> CPrimPath *oldPath = dynamic_cast<const CPrimPath *>(prim); +01770 <font class="keywordflow">if</font> (oldPath) +01771 { +01772 <font class="comment">// Create a primitive</font> +01773 CPrimPath *path = <font class="keyword">new</font> CPrimPath (); +01774 primitive = path; +01775 +01776 <font class="comment">// Copy it</font> +01777 *path = *oldPath; +01778 } +01779 <font class="keywordflow">else</font> +01780 { +01781 <font class="keyword">const</font> CPrimZone *oldZone = safe_cast<const CPrimZone *>(prim); +01782 <font class="keywordflow">if</font> (oldZone) +01783 { +01784 <font class="comment">// Create a primitive</font> +01785 CPrimZone *zone = <font class="keyword">new</font> CPrimZone (); +01786 primitive = zone; +01787 +01788 <font class="comment">// Copy it</font> +01789 *zone = *oldZone; +01790 } +01791 } +01792 } +01793 +01794 <font class="comment">// Primitive has been created ?</font> +01795 <font class="keywordflow">if</font> (primitive) +01796 { +01797 <font class="comment">// Create a property for the name</font> +01798 CPropertyString *nameProp = <font class="keyword">new</font> CPropertyString; +01799 nameProp->String = prim->Name; +01800 +01801 <font class="comment">// Add the property</font> +01802 primitive->addPropertyByName (<font class="stringliteral">"Name"</font>, nameProp); +01803 +01804 <font class="comment">// The primitive is hidden ?</font> +01805 <font class="keywordflow">if</font> (hidden) +01806 { +01807 <font class="comment">// Create a property for hidden</font> +01808 nameProp = <font class="keyword">new</font> CPropertyString; +01809 +01810 <font class="comment">// Add the property</font> +01811 primitive->addPropertyByName (<font class="stringliteral">"Hidden"</font>, nameProp); +01812 } +01813 +01814 <font class="comment">// Add the child</font> +01815 child->insertChild (primitive); +01816 } +01817 } +01818 +01819 <font class="comment">// ***************************************************************************</font> +01820 +<a name="l01821"></a><a class="code" href="classNLLIGO_1_1CPrimitives.html#c1">01821</a> <font class="keywordtype">void</font> CPrimitives::convertPrimitive (<font class="keyword">const</font> IPrimitive *prim, <font class="keywordtype">bool</font> hidden) +01822 { +01823 <font class="comment">// Look for the group</font> +01824 uint numChildren = <a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>.getNumChildren (); +01825 uint j; +01826 <font class="keywordflow">for</font> (j=0; j<numChildren; j++) +01827 { +01828 IPrimitive *child; +01829 <a class="code" href="debug_8h.html#a9">nlverify</a> (<a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>.getChild (child, j)); +01830 <font class="keyword">const</font> IProperty *prop; +01831 <font class="keywordflow">if</font> (child->getPropertyByName (<font class="stringliteral">"Name"</font>, prop)) +01832 { +01833 <font class="comment">// Prop string</font> +01834 <font class="keyword">const</font> CPropertyString *name = dynamic_cast<const CPropertyString *>(prop); +01835 <font class="keywordflow">if</font> (name) +01836 { +01837 <font class="comment">// This one ?</font> +01838 <font class="keywordflow">if</font> (name->String == prim->Layer) +01839 { +01840 <a class="code" href="classNLLIGO_1_1CPrimitives.html#c0">convertAddPrimitive</a> (child, prim, hidden); +01841 <font class="keywordflow">break</font>; +01842 } +01843 } +01844 } +01845 } +01846 +01847 <font class="comment">// Not found ?</font> +01848 <font class="keywordflow">if</font> (j==numChildren) +01849 { +01850 <font class="comment">// Create a node</font> +01851 CPrimNode *primNode = <font class="keyword">new</font> CPrimNode; +01852 +01853 <font class="comment">// Create a property for the layer</font> +01854 CPropertyString *nameProp = <font class="keyword">new</font> CPropertyString; +01855 nameProp->String = prim->Layer; +01856 +01857 <font class="comment">// Add the property</font> +01858 primNode->addPropertyByName (<font class="stringliteral">"Name"</font>, nameProp); +01859 +01860 <font class="comment">// Add the child</font> +01861 <a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>.insertChild (primNode); +01862 +01863 <font class="comment">// Add the primitive</font> +01864 <a class="code" href="classNLLIGO_1_1CPrimitives.html#c0">convertAddPrimitive</a> (primNode, prim, hidden); +01865 } +01866 } +01867 +01868 <font class="comment">// ***************************************************************************</font> +01869 +<a name="l01870"></a><a class="code" href="classNLLIGO_1_1CPrimitives.html#a0">01870</a> <font class="keywordtype">void</font> CPrimitives::convert (<font class="keyword">const</font> CPrimRegion &region) +01871 { +01872 <font class="comment">// Delete</font> +01873 <a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>.removeChildren (); +01874 <a class="code" href="classNLLIGO_1_1CPrimitives.html#m0">RootNode</a>.removeProperties (); +01875 +01876 <font class="comment">// For each primitives</font> +01877 uint i; +01878 <font class="keywordflow">for</font> (i=0; i<region.VPoints.size (); i++) +01879 { +01880 <a class="code" href="classNLLIGO_1_1CPrimitives.html#c1">convertPrimitive</a> (&(region.VPoints[i]), region.VHidePoints[i]); +01881 } +01882 <font class="keywordflow">for</font> (i=0; i<region.VPaths.size (); i++) +01883 { +01884 <a class="code" href="classNLLIGO_1_1CPrimitives.html#c1">convertPrimitive</a> (&(region.VPaths[i]), region.VHidePaths[i]); +01885 } +01886 <font class="keywordflow">for</font> (i=0; i<region.VZones.size (); i++) +01887 { +01888 <a class="code" href="classNLLIGO_1_1CPrimitives.html#c1">convertPrimitive</a> (&(region.VZones[i]), region.VHideZones[i]); +01889 } +01890 } +01891 +01892 <font class="comment">// ***************************************************************************</font> +01893 +01894 +01895 } <font class="comment">// namespace NLLIGO</font> +01896 +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |