Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
cd18ff17
Commit
cd18ff17
authored
Mar 28, 2013
by
Wayne Stambaugh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix X3D patch commit coding policy issues.
parent
3c037a3c
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
266 additions
and
228 deletions
+266
-228
3d_read_mesh.cpp
3d-viewer/3d_read_mesh.cpp
+17
-12
modelparsers.h
3d-viewer/modelparsers.h
+36
-20
vrmlmodelparser.cpp
3d-viewer/vrmlmodelparser.cpp
+14
-25
x3dmodelparser.cpp
3d-viewer/x3dmodelparser.cpp
+150
-117
common_plot_functions.cpp
common/common_plot_functions.cpp
+1
-1
wxPcbStruct.h
include/wxPcbStruct.h
+11
-0
export_vrml.cpp
pcbnew/export_vrml.cpp
+37
-53
No files found.
3d-viewer/3d_read_mesh.cpp
View file @
cd18ff17
...
@@ -41,16 +41,17 @@
...
@@ -41,16 +41,17 @@
// Imported function:
// Imported function:
extern
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
extern
void
Set_Object_Data
(
std
::
vector
<
S3D_VERTEX
>&
aVertices
,
double
aBiuTo3DUnits
);
S3D_MODEL_PARSER
*
S3D_MODEL_PARSER
::
Create
(
S3D_MASTER
*
aMaster
,
const
wxString
aExtension
)
S3D_MODEL_PARSER
*
S3D_MODEL_PARSER
::
Create
(
S3D_MASTER
*
aMaster
,
const
wxString
aExtension
)
{
{
if
(
aExtension
==
wxT
(
"x3d"
)
)
if
(
aExtension
==
wxT
(
"x3d"
)
)
{
{
return
new
X3D_MODEL_PARSER
(
aMaster
);
return
new
X3D_MODEL_PARSER
(
aMaster
);
}
}
else
if
(
aExtension
==
wxT
(
"wrl"
)
)
else
if
(
aExtension
==
wxT
(
"wrl"
)
)
{
{
return
new
VRML_MODEL_PARSER
(
aMaster
);
return
new
VRML_MODEL_PARSER
(
aMaster
);
}
}
else
else
{
{
...
@@ -58,6 +59,7 @@ S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster,
...
@@ -58,6 +59,7 @@ S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster,
}
}
}
}
int
S3D_MASTER
::
ReadData
()
int
S3D_MASTER
::
ReadData
()
{
{
wxFileName
fn
;
wxFileName
fn
;
...
@@ -69,16 +71,17 @@ int S3D_MASTER::ReadData()
...
@@ -69,16 +71,17 @@ int S3D_MASTER::ReadData()
}
}
wxString
shape3DNname
=
m_Shape3DName
;
wxString
shape3DNname
=
m_Shape3DName
;
#ifdef __WINDOWS__
#ifdef __WINDOWS__
shape3DNname
.
Replace
(
wxT
(
"/"
),
wxT
(
"
\\
"
)
);
shape3DNname
.
Replace
(
wxT
(
"/"
),
wxT
(
"
\\
"
)
);
#else
#else
shape3DNname
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
shape3DNname
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
#endif
#endif
if
(
wxFileName
::
FileExists
(
shape3DNname
)
)
if
(
wxFileName
::
FileExists
(
shape3DNname
)
)
{
{
FullFilename
=
shape3DNname
;
FullFilename
=
shape3DNname
;
fn
.
Assign
(
FullFilename
);
fn
.
Assign
(
FullFilename
);
}
}
else
else
{
{
...
@@ -94,14 +97,15 @@ int S3D_MASTER::ReadData()
...
@@ -94,14 +97,15 @@ int S3D_MASTER::ReadData()
}
}
wxString
extension
=
fn
.
GetExt
();
wxString
extension
=
fn
.
GetExt
();
S3D_MODEL_PARSER
*
parser
=
S3D_MODEL_PARSER
::
Create
(
this
,
extension
);
S3D_MODEL_PARSER
*
parser
=
S3D_MODEL_PARSER
::
Create
(
this
,
extension
);
if
(
parser
)
if
(
parser
)
{
{
parser
->
Load
(
FullFilename
);
parser
->
Load
(
FullFilename
);
delete
parser
;
delete
parser
;
return
0
;
return
0
;
}
}
else
else
{
{
wxLogDebug
(
wxT
(
"Unknown file type <%s>"
),
GetChars
(
extension
)
);
wxLogDebug
(
wxT
(
"Unknown file type <%s>"
),
GetChars
(
extension
)
);
}
}
...
@@ -109,6 +113,7 @@ int S3D_MASTER::ReadData()
...
@@ -109,6 +113,7 @@ int S3D_MASTER::ReadData()
return
-
1
;
return
-
1
;
}
}
int
STRUCT_3D_SHAPE
::
ReadData
(
FILE
*
file
,
int
*
LineNum
)
int
STRUCT_3D_SHAPE
::
ReadData
(
FILE
*
file
,
int
*
LineNum
)
{
{
char
line
[
512
];
char
line
[
512
];
...
...
3d-viewer/modelparsers.h
View file @
cd18ff17
...
@@ -49,8 +49,8 @@ class X3D_MODEL_PARSER;
...
@@ -49,8 +49,8 @@ class X3D_MODEL_PARSER;
class
S3D_MODEL_PARSER
class
S3D_MODEL_PARSER
{
{
public
:
public
:
S3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
S3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
:
:
master
(
aMaster
)
master
(
aMaster
)
{}
{}
virtual
~
S3D_MODEL_PARSER
()
virtual
~
S3D_MODEL_PARSER
()
...
@@ -64,19 +64,18 @@ public:
...
@@ -64,19 +64,18 @@ public:
/**
/**
* Function Create
* Function Create
* Factory method for creating concrete 3D model parsers
* Factory method for creating concrete 3D model parsers
* Notice that the caller is responible to delete created parser.
* Notice that the caller is respon
s
ible to delete created parser.
*
*
* @param aMaster is master object that the parser will fill.
* @param aMaster is master object that the parser will fill.
* @param aExtension is file extension of the file you are going to parse.
* @param aExtension is file extension of the file you are going to parse.
*/
*/
static
S3D_MODEL_PARSER
*
Create
(
S3D_MASTER
*
aMaster
,
static
S3D_MODEL_PARSER
*
Create
(
S3D_MASTER
*
aMaster
,
const
wxString
aExtension
);
const
wxString
aExtension
);
/**
/**
* Function Load
* Function Load
*
*
* Concrete parsers should implement this function
* Concrete parsers should implement this function
*/
*/
virtual
void
Load
(
const
wxString
aFilename
)
=
0
;
virtual
void
Load
(
const
wxString
aFilename
)
=
0
;
private
:
private
:
S3D_MASTER
*
master
;
S3D_MASTER
*
master
;
...
@@ -92,9 +91,9 @@ class wxXmlNode;
...
@@ -92,9 +91,9 @@ class wxXmlNode;
class
X3D_MODEL_PARSER
:
public
S3D_MODEL_PARSER
class
X3D_MODEL_PARSER
:
public
S3D_MODEL_PARSER
{
{
public
:
public
:
X3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
);
X3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
);
~
X3D_MODEL_PARSER
();
~
X3D_MODEL_PARSER
();
void
Load
(
const
wxString
aFilename
);
void
Load
(
const
wxString
aFilename
);
typedef
std
::
map
<
wxString
,
wxString
>
PROPERTY_MAP
;
typedef
std
::
map
<
wxString
,
wxString
>
PROPERTY_MAP
;
typedef
std
::
vector
<
wxXmlNode
*
>
NODE_LIST
;
typedef
std
::
vector
<
wxXmlNode
*
>
NODE_LIST
;
...
@@ -107,8 +106,7 @@ public:
...
@@ -107,8 +106,7 @@ public:
* @param aName is the name of node you try to find
* @param aName is the name of node you try to find
* @param aResult contains found nodes
* @param aResult contains found nodes
*/
*/
static
void
GetChildsByName
(
wxXmlNode
*
aParent
,
const
wxString
aName
,
static
void
GetChildsByName
(
wxXmlNode
*
aParent
,
const
wxString
aName
,
NODE_LIST
&
aResult
);
NODE_LIST
&
aResult
);
/**
/**
* Function GetNodeProperties
* Function GetNodeProperties
...
@@ -116,7 +114,7 @@ public:
...
@@ -116,7 +114,7 @@ public:
*
*
* @param aProps contains map of found properties
* @param aProps contains map of found properties
*/
*/
static
void
GetNodeProperties
(
wxXmlNode
*
aNode
,
PROPERTY_MAP
&
aProps
);
static
void
GetNodeProperties
(
wxXmlNode
*
aNode
,
PROPERTY_MAP
&
aProps
);
/**
/**
* Return string representing x3d file in vrml format
* Return string representing x3d file in vrml format
...
@@ -126,17 +124,16 @@ public:
...
@@ -126,17 +124,16 @@ public:
wxString
VRML_representation
();
wxString
VRML_representation
();
private
:
private
:
std
::
vector
<
wxString
>
vrml_materials
;
std
::
vector
<
wxString
>
vrml_materials
;
std
::
vector
<
wxString
>
vrml_points
;
std
::
vector
<
wxString
>
vrml_points
;
std
::
vector
<
wxString
>
vrml_coord_indexes
;
std
::
vector
<
wxString
>
vrml_coord_indexes
;
void
readTransform
(
wxXmlNode
*
aTransformNode
);
void
readTransform
(
wxXmlNode
*
aTransformNode
);
void
readMaterial
(
wxXmlNode
*
aMatNode
);
void
readMaterial
(
wxXmlNode
*
aMatNode
);
void
readIndexedFaceSet
(
wxXmlNode
*
aFaceNode
,
void
readIndexedFaceSet
(
wxXmlNode
*
aFaceNode
,
PROPERTY_MAP
&
aTransfromProps
);
PROPERTY_MAP
&
aTransfromProps
);
bool
parseDoubleTriplet
(
const
wxString
&
aData
,
S3D_VERTEX
&
aResult
);
bool
parseDoubleTriplet
(
const
wxString
&
aData
,
S3D_VERTEX
&
aResult
);
void
rotate
(
S3D_VERTEX
&
aCoordinate
,
S3D_VERTEX
&
aRotAxis
,
double
angle
);
void
rotate
(
S3D_VERTEX
&
aCoordinate
,
S3D_VERTEX
&
aRotAxis
,
double
angle
);
};
};
/**
/**
...
@@ -146,9 +143,9 @@ private:
...
@@ -146,9 +143,9 @@ private:
class
VRML_MODEL_PARSER
:
public
S3D_MODEL_PARSER
class
VRML_MODEL_PARSER
:
public
S3D_MODEL_PARSER
{
{
public
:
public
:
VRML_MODEL_PARSER
(
S3D_MASTER
*
aMaster
);
VRML_MODEL_PARSER
(
S3D_MASTER
*
aMaster
);
~
VRML_MODEL_PARSER
();
~
VRML_MODEL_PARSER
();
void
Load
(
const
wxString
aFilename
);
void
Load
(
const
wxString
aFilename
);
private
:
private
:
/**
/**
...
@@ -170,7 +167,26 @@ private:
...
@@ -170,7 +167,26 @@ private:
int
readShape
(
FILE
*
file
,
int
*
LineNum
);
int
readShape
(
FILE
*
file
,
int
*
LineNum
);
int
readAppearance
(
FILE
*
file
,
int
*
LineNum
);
int
readAppearance
(
FILE
*
file
,
int
*
LineNum
);
int
readGeometry
(
FILE
*
file
,
int
*
LineNum
);
int
readGeometry
(
FILE
*
file
,
int
*
LineNum
);
void
readCoordsList
(
FILE
*
file
,
char
*
text_buffer
,
std
::
vector
<
double
>&
aList
,
int
*
LineNum
);
/**
* Function ReadCoordList
* reads 3D coordinate lists like:
* coord Coordinate { point [
* -5.24489 6.57640e-3 -9.42129e-2,
* -5.11821 6.57421e-3 0.542654,
* -3.45868 0.256565 1.32000 ] }
* or:
* normal Normal { vector [
* 0.995171 -6.08102e-6 9.81541e-2,
* 0.923880 -4.09802e-6 0.382683,
* 0.707107 -9.38186e-7 0.707107]
* }
*
* text_buffer contains the first line of this node :
* "coord Coordinate { point ["
*/
void
readCoordsList
(
FILE
*
file
,
char
*
text_buffer
,
std
::
vector
<
double
>&
aList
,
int
*
LineNum
);
};
};
#endif // MODELPARSERS_H
#endif // MODELPARSERS_H
3d-viewer/vrmlmodelparser.cpp
View file @
cd18ff17
...
@@ -36,19 +36,21 @@
...
@@ -36,19 +36,21 @@
#include "3d_struct.h"
#include "3d_struct.h"
#include "modelparsers.h"
#include "modelparsers.h"
// separator chars
// separator chars
static
const
char
*
sep_chars
=
"
\t\n\r
"
;
static
const
char
*
sep_chars
=
"
\t\n\r
"
;
VRML_MODEL_PARSER
::
VRML_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
VRML_MODEL_PARSER
::
VRML_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
:
:
S3D_MODEL_PARSER
(
aMaster
)
S3D_MODEL_PARSER
(
aMaster
)
{}
{}
VRML_MODEL_PARSER
::~
VRML_MODEL_PARSER
()
VRML_MODEL_PARSER
::~
VRML_MODEL_PARSER
()
{}
{}
void
VRML_MODEL_PARSER
::
Load
(
const
wxString
aFilename
)
{
void
VRML_MODEL_PARSER
::
Load
(
const
wxString
aFilename
)
{
char
line
[
1024
],
*
text
;
char
line
[
1024
],
*
text
;
FILE
*
file
;
FILE
*
file
;
int
LineNum
=
0
;
int
LineNum
=
0
;
...
@@ -67,7 +69,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename)
...
@@ -67,7 +69,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename)
{
{
text
=
strtok
(
line
,
sep_chars
);
text
=
strtok
(
line
,
sep_chars
);
if
(
stricmp
(
text
,
"DEF"
)
==
0
||
stricmp
(
text
,
"Group"
)
==
0
)
if
(
stricmp
(
text
,
"DEF"
)
==
0
||
stricmp
(
text
,
"Group"
)
==
0
)
{
{
while
(
GetLine
(
file
,
line
,
&
LineNum
,
512
)
)
while
(
GetLine
(
file
,
line
,
&
LineNum
,
512
)
)
{
{
...
@@ -91,6 +93,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename)
...
@@ -91,6 +93,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename)
SetLocaleTo_Default
();
// revert to the current locale
SetLocaleTo_Default
();
// revert to the current locale
}
}
int
VRML_MODEL_PARSER
::
readMaterial
(
FILE
*
file
,
int
*
LineNum
)
int
VRML_MODEL_PARSER
::
readMaterial
(
FILE
*
file
,
int
*
LineNum
)
{
{
char
line
[
512
],
*
text
,
*
command
;
char
line
[
512
],
*
text
,
*
command
;
...
@@ -258,7 +261,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
...
@@ -258,7 +261,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
if
(
*
text
==
'}'
)
if
(
*
text
==
'}'
)
{
{
err
=
0
;
break
;
err
=
0
;
break
;
}
}
if
(
stricmp
(
text
,
"material"
)
==
0
)
if
(
stricmp
(
text
,
"material"
)
==
0
)
...
@@ -278,24 +282,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
...
@@ -278,24 +282,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
#define BUFSIZE 2000
#define BUFSIZE 2000
/**
void
VRML_MODEL_PARSER
::
readCoordsList
(
FILE
*
file
,
char
*
text_buffer
,
* Function ReadCoordList
std
::
vector
<
double
>&
aList
,
int
*
LineNum
)
* reads 3D coordinate lists like:
* coord Coordinate { point [
* -5.24489 6.57640e-3 -9.42129e-2,
* -5.11821 6.57421e-3 0.542654,
* -3.45868 0.256565 1.32000 ] }
* or:
* normal Normal { vector [
* 0.995171 -6.08102e-6 9.81541e-2,
* 0.923880 -4.09802e-6 0.382683,
* 0.707107 -9.38186e-7 0.707107]
* }
*
* text_buffer contains the first line of this node :
* "coord Coordinate { point ["
*/
void
VRML_MODEL_PARSER
::
readCoordsList
(
FILE
*
file
,
char
*
text_buffer
,
std
::
vector
<
double
>&
aList
,
int
*
LineNum
)
{
{
unsigned
int
ii
=
0
,
jj
=
0
;
unsigned
int
ii
=
0
,
jj
=
0
;
char
*
text
;
char
*
text
;
...
@@ -399,6 +387,7 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
...
@@ -399,6 +387,7 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
else
else
{
{
}
}
continue
;
continue
;
}
}
...
...
3d-viewer/x3dmodelparser.cpp
View file @
cd18ff17
...
@@ -39,17 +39,20 @@
...
@@ -39,17 +39,20 @@
#include "3d_struct.h"
#include "3d_struct.h"
#include "modelparsers.h"
#include "modelparsers.h"
X3D_MODEL_PARSER
::
X3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
X3D_MODEL_PARSER
::
X3D_MODEL_PARSER
(
S3D_MASTER
*
aMaster
)
:
:
S3D_MODEL_PARSER
(
aMaster
)
S3D_MODEL_PARSER
(
aMaster
)
{}
{}
X3D_MODEL_PARSER
::~
X3D_MODEL_PARSER
()
X3D_MODEL_PARSER
::~
X3D_MODEL_PARSER
()
{}
{}
void
X3D_MODEL_PARSER
::
Load
(
const
wxString
aFilename
)
void
X3D_MODEL_PARSER
::
Load
(
const
wxString
aFilename
)
{
{
wxXmlDocument
doc
;
wxXmlDocument
doc
;
if
(
!
doc
.
Load
(
aFilename
)
)
if
(
!
doc
.
Load
(
aFilename
)
)
{
{
wxLogError
(
wxT
(
"Error while parsing file <%s>"
),
GetChars
(
aFilename
)
);
wxLogError
(
wxT
(
"Error while parsing file <%s>"
),
GetChars
(
aFilename
)
);
return
;
return
;
...
@@ -62,74 +65,85 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
...
@@ -62,74 +65,85 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
}
}
// Shapes are inside of Transform nodes
// Shapes are inside of Transform nodes
// Transform node contains information about
// Transform node contains information about
// transition, scale and rotation of the shape
// transition, scale and rotation of the shape
NODE_LIST
transforms
;
NODE_LIST
transforms
;
GetChildsByName
(
doc
.
GetRoot
(),
wxT
(
"Transform"
),
transforms
);
GetChildsByName
(
doc
.
GetRoot
(),
wxT
(
"Transform"
),
transforms
);
for
(
NODE_LIST
::
iterator
node_it
=
transforms
.
begin
();
for
(
NODE_LIST
::
iterator
node_it
=
transforms
.
begin
();
node_it
!=
transforms
.
end
();
node_it
!=
transforms
.
end
();
node_it
++
)
node_it
++
)
{
{
readTransform
(
*
node_it
);
readTransform
(
*
node_it
);
}
}
}
}
wxString
X3D_MODEL_PARSER
::
VRML_representation
()
wxString
X3D_MODEL_PARSER
::
VRML_representation
()
{
{
wxString
output
;
wxString
output
;
for
(
unsigned
i
=
0
;
i
<
vrml_points
.
size
();
i
++
)
for
(
unsigned
i
=
0
;
i
<
vrml_points
.
size
();
i
++
)
{
{
output
+=
wxT
(
"Shape {
\n
"
output
+=
wxT
(
"Shape {
\n
"
" appearance Appearance {
\n
"
" appearance Appearance {
\n
"
" material Material {
\n
"
)
+
" material Material {
\n
"
)
+
vrml_materials
[
i
]
+
vrml_materials
[
i
]
+
wxT
(
" }
\n
"
wxT
(
" }
\n
"
" }
\n
"
" }
\n
"
" geometry IndexedFaceSet {
\n
"
" geometry IndexedFaceSet {
\n
"
" solid TRUE
\n
"
" solid TRUE
\n
"
" coord Coordinate {
\n
"
" coord Coordinate {
\n
"
" point [
\n
"
)
+
" point [
\n
"
)
+
vrml_points
[
i
]
+
vrml_points
[
i
]
+
wxT
(
" ]
\n
"
wxT
(
" ]
\n
"
" }
\n
"
" }
\n
"
" coordIndex [
\n
"
)
+
" coordIndex [
\n
"
)
+
vrml_coord_indexes
[
i
]
+
vrml_coord_indexes
[
i
]
+
wxT
(
" ]
\n
"
wxT
(
" ]
\n
"
" }
\n
"
" }
\n
"
"},
\n
"
);
"},
\n
"
);
}
}
return
output
;
return
output
;
}
}
void
X3D_MODEL_PARSER
::
GetChildsByName
(
wxXmlNode
*
aParent
,
const
wxString
aName
,
void
X3D_MODEL_PARSER
::
GetChildsByName
(
wxXmlNode
*
aParent
,
std
::
vector
<
wxXmlNode
*
>&
aResult
)
const
wxString
aName
,
std
::
vector
<
wxXmlNode
*
>&
aResult
)
{
{
// Breadth-first search (BFS)
// Breadth-first search (BFS)
std
::
queue
<
wxXmlNode
*
>
found
;
std
::
queue
<
wxXmlNode
*
>
found
;
found
.
push
(
aParent
);
found
.
push
(
aParent
);
while
(
!
found
.
empty
()
)
while
(
!
found
.
empty
()
)
{
{
wxXmlNode
*
elem
=
found
.
front
();
wxXmlNode
*
elem
=
found
.
front
();
for
(
wxXmlNode
*
child
=
elem
->
GetChildren
();
for
(
wxXmlNode
*
child
=
elem
->
GetChildren
();
child
!=
NULL
;
child
!=
NULL
;
child
=
child
->
GetNext
()
)
child
=
child
->
GetNext
()
)
{
{
if
(
child
->
GetName
()
==
aName
)
if
(
child
->
GetName
()
==
aName
)
{
{
aResult
.
push_back
(
child
);
aResult
.
push_back
(
child
);
}
}
found
.
push
(
child
);
found
.
push
(
child
);
}
}
found
.
pop
();
found
.
pop
();
}
}
}
}
void
X3D_MODEL_PARSER
::
GetNodeProperties
(
wxXmlNode
*
aNode
,
PROPERTY_MAP
&
aProps
)
{
void
X3D_MODEL_PARSER
::
GetNodeProperties
(
wxXmlNode
*
aNode
,
PROPERTY_MAP
&
aProps
)
{
wxXmlProperty
*
prop
;
wxXmlProperty
*
prop
;
for
(
prop
=
aNode
->
GetProperties
();
prop
!=
NULL
;
for
(
prop
=
aNode
->
GetAttributes
();
prop
!=
NULL
;
prop
=
prop
->
GetNext
()
)
prop
=
prop
->
GetNext
()
)
{
{
aProps
[
prop
->
GetName
()
]
=
prop
->
GetValue
();
aProps
[
prop
->
GetName
()
]
=
prop
->
GetValue
();
...
@@ -145,98 +159,110 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
...
@@ -145,98 +159,110 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
for
(
NODE_LIST
::
iterator
node
=
childnodes
.
begin
();
for
(
NODE_LIST
::
iterator
node
=
childnodes
.
begin
();
node
!=
childnodes
.
end
();
node
!=
childnodes
.
end
();
node
++
)
node
++
)
{
{
readMaterial
(
*
node
);
readMaterial
(
*
node
);
}
}
childnodes
.
clear
();
childnodes
.
clear
();
PROPERTY_MAP
properties
;
PROPERTY_MAP
properties
;
GetNodeProperties
(
aTransformNode
,
properties
);
GetNodeProperties
(
aTransformNode
,
properties
);
GetChildsByName
(
aTransformNode
,
wxT
(
"IndexedFaceSet"
),
childnodes
);
GetChildsByName
(
aTransformNode
,
wxT
(
"IndexedFaceSet"
),
childnodes
);
for
(
NODE_LIST
::
iterator
node
=
childnodes
.
begin
();
for
(
NODE_LIST
::
iterator
node
=
childnodes
.
begin
();
node
!=
childnodes
.
end
();
node
!=
childnodes
.
end
();
node
++
)
node
++
)
{
{
readIndexedFaceSet
(
*
node
,
properties
);
readIndexedFaceSet
(
*
node
,
properties
);
}
}
childnodes
.
clear
();
childnodes
.
clear
();
}
}
void
X3D_MODEL_PARSER
::
readMaterial
(
wxXmlNode
*
aMatNode
)
void
X3D_MODEL_PARSER
::
readMaterial
(
wxXmlNode
*
aMatNode
)
{
{
PROPERTY_MAP
properties
;
PROPERTY_MAP
properties
;
GetNodeProperties
(
aMatNode
,
properties
);
GetNodeProperties
(
aMatNode
,
properties
);
// DEFine new Material named as value of DEF
// DEFine new Material named as value of DEF
if
(
properties
.
find
(
wxT
(
"DEF"
)
)
!=
properties
.
end
()
)
{
if
(
properties
.
find
(
wxT
(
"DEF"
)
)
!=
properties
.
end
()
)
{
double
amb
,
shine
,
transp
;
double
amb
,
shine
,
transp
;
S3D_MATERIAL
*
material
=
new
S3D_MATERIAL
(
GetMaster
(),
properties
[
wxT
(
"DEF"
)
]
);
S3D_MATERIAL
*
material
=
new
S3D_MATERIAL
(
GetMaster
(),
properties
[
wxT
(
"DEF"
)
]
);
GetMaster
()
->
Insert
(
material
);
GetMaster
()
->
Insert
(
material
);
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"diffuseColor"
)
],
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"diffuseColor"
)
],
material
->
m_DiffuseColor
)
)
material
->
m_DiffuseColor
)
)
{
{
D
(
printf
(
"diffuseColor parsing error"
)
);
D
(
printf
(
"diffuseColor parsing error"
)
);
}
}
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"specularColor"
)
],
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"specularColor"
)
],
material
->
m_SpecularColor
)
)
material
->
m_SpecularColor
)
)
{
{
D
(
printf
(
"specularColor parsing error"
)
);
D
(
printf
(
"specularColor parsing error"
)
);
}
}
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"emissiveColor"
)
],
if
(
!
parseDoubleTriplet
(
properties
[
wxT
(
"emissiveColor"
)
],
material
->
m_EmissiveColor
)
)
material
->
m_EmissiveColor
)
)
{
{
D
(
printf
(
"emissiveColor parsing error"
)
);
D
(
printf
(
"emissiveColor parsing error"
)
);
}
}
wxStringTokenizer
values
;
wxStringTokenizer
values
;
values
.
SetString
(
properties
[
wxT
(
"ambientIntensity"
)
]
);
values
.
SetString
(
properties
[
wxT
(
"ambientIntensity"
)
]
);
if
(
values
.
GetNextToken
().
ToDouble
(
&
amb
)
)
if
(
values
.
GetNextToken
().
ToDouble
(
&
amb
)
)
{
{
material
->
m_AmbientIntensity
=
amb
;
material
->
m_AmbientIntensity
=
amb
;
}
}
else
else
{
{
D
(
printf
(
"ambienterror"
)
);
D
(
printf
(
"ambienterror"
)
);
}
}
values
.
SetString
(
properties
[
wxT
(
"shininess"
)
]
);
values
.
SetString
(
properties
[
wxT
(
"shininess"
)
]
);
if
(
values
.
GetNextToken
().
ToDouble
(
&
shine
)
)
if
(
values
.
GetNextToken
().
ToDouble
(
&
shine
)
)
{
{
material
->
m_Shininess
=
shine
;
material
->
m_Shininess
=
shine
;
}
}
else
{
else
D
(
printf
(
"shininess error"
)
);
{
D
(
printf
(
"shininess error"
)
);
}
}
values
.
SetString
(
properties
[
wxT
(
"transparency"
)
]
);
values
.
SetString
(
properties
[
wxT
(
"transparency"
)
]
);
if
(
values
.
GetNextToken
().
ToDouble
(
&
transp
)
)
if
(
values
.
GetNextToken
().
ToDouble
(
&
transp
)
)
{
{
material
->
m_Transparency
=
transp
;
material
->
m_Transparency
=
transp
;
}
}
else
else
{
{
D
(
printf
(
"trans error"
)
);
D
(
printf
(
"trans error"
)
);
}
}
material
->
SetMaterial
();
material
->
SetMaterial
();
// VRML
// VRML
wxString
vrml_material
;
wxString
vrml_material
;
PROPERTY_MAP
::
const_iterator
p
=
++
properties
.
begin
();
// skip DEF
PROPERTY_MAP
::
const_iterator
p
=
++
properties
.
begin
();
// skip DEF
for
(;
p
!=
properties
.
end
();
p
++
)
{
vrml_material
.
Append
(
p
->
first
+
wxT
(
" "
)
+
p
->
second
+
wxT
(
"
\n
"
)
);
for
(;
p
!=
properties
.
end
();
p
++
)
{
vrml_material
.
Append
(
p
->
first
+
wxT
(
" "
)
+
p
->
second
+
wxT
(
"
\n
"
)
);
}
}
vrml_materials
.
push_back
(
vrml_material
);
vrml_materials
.
push_back
(
vrml_material
);
}
}
// USE existing material named by value of USE
// USE existing material named by value of USE
else
if
(
properties
.
find
(
wxT
(
"USE"
)
)
!=
properties
.
end
()
)
{
else
if
(
properties
.
find
(
wxT
(
"USE"
)
)
!=
properties
.
end
()
)
{
S3D_MATERIAL
*
material
=
NULL
;
S3D_MATERIAL
*
material
=
NULL
;
wxString
mat_name
=
properties
[
wxT
(
"USE"
)
];
wxString
mat_name
=
properties
[
wxT
(
"USE"
)
];
...
@@ -244,34 +270,33 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
...
@@ -244,34 +270,33 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
{
{
if
(
material
->
m_Name
==
mat_name
)
if
(
material
->
m_Name
==
mat_name
)
{
{
wxString
vrml_material
;
wxString
vrml_material
;
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"specularColor %f %f %f
\n
"
),
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"specularColor %f %f %f
\n
"
),
material
->
m_SpecularColor
.
x
,
material
->
m_SpecularColor
.
x
,
material
->
m_SpecularColor
.
y
,
material
->
m_SpecularColor
.
y
,
material
->
m_SpecularColor
.
z
)
);
material
->
m_SpecularColor
.
z
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"diffuseColor %f %f %f
\n
"
),
material
->
m_DiffuseColor
.
x
,
material
->
m_DiffuseColor
.
y
,
material
->
m_DiffuseColor
.
z
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"
diffuseColor %f %f %f
\n
"
),
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"
emissiveColor %f %f %f
\n
"
),
material
->
m_
DiffuseColor
.
x
,
material
->
m_
EmissiveColor
.
x
,
material
->
m_
DiffuseColor
.
y
,
material
->
m_
EmissiveColor
.
y
,
material
->
m_
DiffuseColor
.
z
)
);
material
->
m_
EmissiveColor
.
z
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"emissiveColor %f %f %f
\n
"
),
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"ambientIntensity %f
\n
"
),
material
->
m_EmissiveColor
.
x
,
material
->
m_AmbientIntensity
)
);
material
->
m_EmissiveColor
.
y
,
material
->
m_EmissiveColor
.
z
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"
ambientIntensity %f
\n
"
),
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"
shininess %f
\n
"
),
material
->
m_
AmbientIntensity
)
);
material
->
m_
Shininess
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"shininess %f
\n
"
),
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"transparency %f
\n
"
),
material
->
m_Shininess
)
);
material
->
m_Transparency
)
);
vrml_material
.
Append
(
wxString
::
Format
(
wxT
(
"transparency %f
\n
"
),
material
->
m_Transparency
)
);
vrml_materials
.
push_back
(
vrml_material
);
vrml_materials
.
push_back
(
vrml_material
);
material
->
SetMaterial
();
material
->
SetMaterial
();
return
;
return
;
...
@@ -279,39 +304,40 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
...
@@ -279,39 +304,40 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
}
}
D
(
printf
(
"ReadMaterial error: material not found
\n
"
)
);
D
(
printf
(
"ReadMaterial error: material not found
\n
"
)
);
}
}
}
}
bool
X3D_MODEL_PARSER
::
parseDoubleTriplet
(
const
wxString
&
aData
,
bool
X3D_MODEL_PARSER
::
parseDoubleTriplet
(
const
wxString
&
aData
,
S3D_VERTEX
&
aResult
)
S3D_VERTEX
&
aResult
)
{
{
wxStringTokenizer
tokens
(
aData
);
wxStringTokenizer
tokens
(
aData
);
return
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
x
)
&&
return
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
x
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
y
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
y
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
z
);
tokens
.
GetNextToken
().
ToDouble
(
&
aResult
.
z
);
}
}
void
X3D_MODEL_PARSER
::
rotate
(
S3D_VERTEX
&
aV
,
void
X3D_MODEL_PARSER
::
rotate
(
S3D_VERTEX
&
aV
,
S3D_VERTEX
&
aU
,
S3D_VERTEX
&
aU
,
double
angle
)
double
angle
)
{
{
S3D_VERTEX
rotated
;
S3D_VERTEX
rotated
;
double
C
=
cos
(
angle
);
double
C
=
cos
(
angle
);
double
S
=
sin
(
angle
);
double
S
=
sin
(
angle
);
double
t
=
1.0
-
C
;
double
t
=
1.0
-
C
;
rotated
.
x
=
(
t
*
aU
.
x
*
aU
.
x
+
C
)
*
aV
.
x
+
rotated
.
x
=
(
t
*
aU
.
x
*
aU
.
x
+
C
)
*
aV
.
x
+
(
t
*
aU
.
x
*
aU
.
y
-
S
*
aU
.
z
)
*
aV
.
y
+
(
t
*
aU
.
x
*
aU
.
y
-
S
*
aU
.
z
)
*
aV
.
y
+
(
t
*
aU
.
x
*
aU
.
z
+
S
*
aU
.
y
)
*
aV
.
z
;
(
t
*
aU
.
x
*
aU
.
z
+
S
*
aU
.
y
)
*
aV
.
z
;
rotated
.
y
=
(
t
*
aU
.
x
*
aU
.
y
+
S
*
aU
.
z
)
*
aV
.
x
+
rotated
.
y
=
(
t
*
aU
.
x
*
aU
.
y
+
S
*
aU
.
z
)
*
aV
.
x
+
(
t
*
aU
.
y
*
aU
.
y
+
C
)
*
aV
.
y
+
(
t
*
aU
.
y
*
aU
.
y
+
C
)
*
aV
.
y
+
(
t
*
aU
.
y
*
aU
.
z
-
S
*
aU
.
x
)
*
aV
.
z
;
(
t
*
aU
.
y
*
aU
.
z
-
S
*
aU
.
x
)
*
aV
.
z
;
rotated
.
z
=
(
t
*
aU
.
x
*
aU
.
z
-
S
*
aU
.
y
)
*
aV
.
x
+
rotated
.
z
=
(
t
*
aU
.
x
*
aU
.
z
-
S
*
aU
.
y
)
*
aV
.
x
+
(
t
*
aU
.
y
*
aU
.
z
+
S
*
aU
.
x
)
*
aV
.
y
+
(
t
*
aU
.
y
*
aU
.
z
+
S
*
aU
.
x
)
*
aV
.
y
+
(
t
*
aU
.
z
*
aU
.
z
+
C
)
*
aV
.
z
;
(
t
*
aU
.
z
*
aU
.
z
+
C
)
*
aV
.
z
;
aV
.
x
=
rotated
.
x
;
aV
.
x
=
rotated
.
x
;
...
@@ -319,21 +345,21 @@ void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV,
...
@@ -319,21 +345,21 @@ void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV,
aV
.
z
=
rotated
.
z
;
aV
.
z
=
rotated
.
z
;
}
}
/* Steps:
/* Steps:
* 1. Read transform data
* 1. Read transform data
* 2. Read ve
c
tex triplets
* 2. Read ve
r
tex triplets
* 3. Read coordinate indexes
* 3. Read coordinate indexes
* 4. Apply geometry to Master object
* 4. Apply geometry to Master object
*/
*/
void
X3D_MODEL_PARSER
::
readIndexedFaceSet
(
wxXmlNode
*
aFaceNode
,
void
X3D_MODEL_PARSER
::
readIndexedFaceSet
(
wxXmlNode
*
aFaceNode
,
PROPERTY_MAP
&
aTransformProps
)
PROPERTY_MAP
&
aTransformProps
)
{
{
/* Step 1: Read transform data
/* Step 1: Read transform data
* --------------------------- */
* --------------------------- */
S3D_VERTEX
translation
;
S3D_VERTEX
translation
;
parseDoubleTriplet
(
aTransformProps
[
wxT
(
"translation"
)
],
parseDoubleTriplet
(
aTransformProps
[
wxT
(
"translation"
)
],
translation
);
translation
);
S3D_VERTEX
scale
;
S3D_VERTEX
scale
;
parseDoubleTriplet
(
aTransformProps
[
wxT
(
"scale"
)
],
scale
);
parseDoubleTriplet
(
aTransformProps
[
wxT
(
"scale"
)
],
scale
);
...
@@ -341,6 +367,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -341,6 +367,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
S3D_VERTEX
rotation
;
S3D_VERTEX
rotation
;
double
angle
=
0.0
;
double
angle
=
0.0
;
wxStringTokenizer
tokens
(
aTransformProps
[
wxT
(
"rotation"
)
]);
wxStringTokenizer
tokens
(
aTransformProps
[
wxT
(
"rotation"
)
]);
if
(
!
(
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
x
)
&&
if
(
!
(
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
x
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
y
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
y
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
z
)
&&
tokens
.
GetNextToken
().
ToDouble
(
&
rotation
.
z
)
&&
...
@@ -349,7 +376,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -349,7 +376,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
D
(
printf
(
"rotation read error"
)
);
D
(
printf
(
"rotation read error"
)
);
}
}
double
vrmlunits_to_3Dunits
=
g_Parm_3D_Visu
.
m_BiuTo3Dunits
*
double
vrmlunits_to_3Dunits
=
g_Parm_3D_Visu
.
m_BiuTo3Dunits
*
UNITS3D_TO_UNITSPCB
;
UNITS3D_TO_UNITSPCB
;
/* Step 2: Read all coordinate points
/* Step 2: Read all coordinate points
...
@@ -365,7 +392,8 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -365,7 +392,8 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
// Save points to vector as doubles
// Save points to vector as doubles
wxStringTokenizer
point_tokens
(
coordinate_properties
[
wxT
(
"point"
)
]
);
wxStringTokenizer
point_tokens
(
coordinate_properties
[
wxT
(
"point"
)
]
);
double
point
=
0.0
;
double
point
=
0.0
;
while
(
point_tokens
.
HasMoreTokens
()
)
while
(
point_tokens
.
HasMoreTokens
()
)
{
{
if
(
point_tokens
.
GetNextToken
().
ToDouble
(
&
point
)
)
if
(
point_tokens
.
GetNextToken
().
ToDouble
(
&
point
)
)
{
{
...
@@ -377,28 +405,30 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -377,28 +405,30 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
}
}
}
}
if
(
points
.
size
()
%
3
!=
0
)
{
if
(
points
.
size
()
%
3
!=
0
)
D
(
printf
(
"Number of points is incorrect"
)
);
{
D
(
printf
(
"Number of points is incorrect"
)
);
return
;
return
;
}
}
/* Create 3D vertex from 3 points and
/* Create 3D vertex from 3 points and
* apply tansforms in order of SCALE, ROTATION, TRANSLATION
* apply t
r
ansforms in order of SCALE, ROTATION, TRANSLATION
*/
*/
wxString
vrml_pointlist
;
wxString
vrml_pointlist
;
std
::
vector
<
S3D_VERTEX
>
triplets
;
std
::
vector
<
S3D_VERTEX
>
triplets
;
for
(
unsigned
id
=
0
;
id
<
points
.
size
()
/
3
;
id
++
)
for
(
unsigned
id
=
0
;
id
<
points
.
size
()
/
3
;
id
++
)
{
{
int
triplet_indx
=
id
*
3
;
int
triplet_indx
=
id
*
3
;
S3D_VERTEX
point
(
points
[
triplet_indx
],
S3D_VERTEX
point
(
points
[
triplet_indx
],
points
[
triplet_indx
+
1
],
points
[
triplet_indx
+
1
],
points
[
triplet_indx
+
2
]
);
points
[
triplet_indx
+
2
]
);
point
.
x
*=
scale
.
x
;
point
.
x
*=
scale
.
x
;
point
.
y
*=
scale
.
y
;
point
.
y
*=
scale
.
y
;
point
.
z
*=
scale
.
z
;
point
.
z
*=
scale
.
z
;
rotate
(
point
,
rotation
,
angle
);
rotate
(
point
,
rotation
,
angle
);
point
.
x
+=
translation
.
x
;
point
.
x
+=
translation
.
x
;
point
.
y
+=
translation
.
y
;
point
.
y
+=
translation
.
y
;
...
@@ -407,9 +437,10 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -407,9 +437,10 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
triplets
.
push_back
(
point
);
triplets
.
push_back
(
point
);
// VRML
// VRML
vrml_pointlist
.
Append
(
wxString
::
Format
(
wxT
(
"%f %f %f
\n
"
),
point
.
x
,
point
.
y
,
point
.
z
)
);
vrml_pointlist
.
Append
(
wxString
::
Format
(
wxT
(
"%f %f %f
\n
"
),
point
.
x
,
point
.
y
,
point
.
z
)
);
}
}
vrml_points
.
push_back
(
vrml_pointlist
);
vrml_points
.
push_back
(
vrml_pointlist
);
/* -- Read coordinate indexes -- */
/* -- Read coordinate indexes -- */
PROPERTY_MAP
faceset_properties
;
PROPERTY_MAP
faceset_properties
;
...
@@ -422,10 +453,11 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -422,10 +453,11 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
wxStringTokenizer
index_tokens
(
coordIndex_str
);
wxStringTokenizer
index_tokens
(
coordIndex_str
);
wxString
vrml_coord_indx_list
;
wxString
vrml_coord_indx_list
;
while
(
index_tokens
.
HasMoreTokens
()
)
while
(
index_tokens
.
HasMoreTokens
()
)
{
{
long
index
=
0
;
long
index
=
0
;
index_tokens
.
GetNextToken
().
ToLong
(
&
index
);
index_tokens
.
GetNextToken
().
ToLong
(
&
index
);
// -1 marks the end of polygon
// -1 marks the end of polygon
if
(
index
<
0
)
if
(
index
<
0
)
...
@@ -433,11 +465,12 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -433,11 +465,12 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
/* Step 4: Apply geometry to Master object
/* Step 4: Apply geometry to Master object
* --------------------------------------- */
* --------------------------------------- */
std
::
vector
<
int
>::
const_iterator
id
;
std
::
vector
<
int
>::
const_iterator
id
;
for
(
id
=
coordIndex
.
begin
();
for
(
id
=
coordIndex
.
begin
();
id
!=
coordIndex
.
end
();
id
!=
coordIndex
.
end
();
id
++
)
id
++
)
{
{
vertices
.
push_back
(
triplets
.
at
(
*
id
)
);
vertices
.
push_back
(
triplets
.
at
(
*
id
)
);
}
}
GetMaster
()
->
Set_Object_Coords
(
vertices
);
GetMaster
()
->
Set_Object_Coords
(
vertices
);
...
@@ -445,14 +478,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
...
@@ -445,14 +478,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
vertices
.
clear
();
vertices
.
clear
();
coordIndex
.
clear
();
coordIndex
.
clear
();
vrml_coord_indx_list
.
Append
(
wxT
(
"-1
\n
"
)
);
vrml_coord_indx_list
.
Append
(
wxT
(
"-1
\n
"
)
);
}
}
else
else
{
{
coordIndex
.
push_back
(
index
);
coordIndex
.
push_back
(
index
);
vrml_coord_indx_list
.
Append
(
wxString
::
Format
(
wxT
(
"%u "
),
index
)
);
vrml_coord_indx_list
.
Append
(
wxString
::
Format
(
wxT
(
"%u "
),
index
)
);
}
}
}
}
vrml_coord_indexes
.
push_back
(
vrml_coord_indx_list
);
}
vrml_coord_indexes
.
push_back
(
vrml_coord_indx_list
);
}
common/common_plot_functions.cpp
View file @
cd18ff17
...
@@ -59,7 +59,7 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock,
...
@@ -59,7 +59,7 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock,
int
iusPerMil
=
plotter
->
GetIUsPerDecimil
()
*
10
;
int
iusPerMil
=
plotter
->
GetIUsPerDecimil
()
*
10
;
wxSize
pageSize
=
aPageInfo
.
GetSizeMils
();
// in mils
wxSize
pageSize
=
aPageInfo
.
GetSizeMils
();
// in mils
int
xg
,
yg
;
int
xg
,
yg
;
int
refx
,
refy
;
//
int refx, refy;
wxPoint
pos
,
end
,
ref
;
wxPoint
pos
,
end
,
ref
;
wxString
msg
;
wxString
msg
;
wxSize
text_size
;
wxSize
text_size
;
...
...
include/wxPcbStruct.h
View file @
cd18ff17
...
@@ -905,6 +905,17 @@ public:
...
@@ -905,6 +905,17 @@ public:
/**
/**
* Function ExportVRML_File
* Function ExportVRML_File
* Creates the file(s) exporting current BOARD to a VRML file.
* Creates the file(s) exporting current BOARD to a VRML file.
*
* @note When copying 3D shapes files, the new filename is build from the full path
* name, changing the separators by underscore. This is needed because files
* with the same shortname can exist in different directories
* @note ExportVRML_File generates coordinates in board units (BIU) inside the file.
* @todo Use mm inside the file. A general scale transform is applied to the whole
* file (1.0 to have the actual WRML unit im mm, 0.001 to have the actual WRML
* unit in meters.
* @note For 3D models built by a 3D modeler, the unit is 0,1 inches. A specfic scale
* is applied to 3D models to convert them to internal units.
*
* @param aFullFileName = the full filename of the file to create
* @param aFullFileName = the full filename of the file to create
* @param aMMtoWRMLunit = the VRML scaling factor:
* @param aMMtoWRMLunit = the VRML scaling factor:
* 1.0 to export in mm. 0.001 for meters
* 1.0 to export in mm. 0.001 for meters
...
...
pcbnew/export_vrml.cpp
View file @
cd18ff17
...
@@ -257,6 +257,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, //{{{
...
@@ -257,6 +257,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, //{{{
"}
\n
"
,
"}
\n
"
,
0
// End marker
0
// End marker
};
};
int
marker_found
=
0
,
lineno
=
0
;
int
marker_found
=
0
,
lineno
=
0
;
while
(
marker_found
<
4
)
while
(
marker_found
<
4
)
...
@@ -554,6 +555,7 @@ static void export_vrml_arc( int layer, double centerx, double centery,
...
@@ -554,6 +555,7 @@ static void export_vrml_arc( int layer, double centerx, double centery,
ring
.
bag
(
layer
,
false
);
ring
.
bag
(
layer
,
false
);
}
}
static
void
export_vrml_varc
(
TRIANGLEBAG
&
triangles
,
static
void
export_vrml_varc
(
TRIANGLEBAG
&
triangles
,
int
top_layer
,
int
bottom_layer
,
int
top_layer
,
int
bottom_layer
,
double
centerx
,
double
centery
,
double
centerx
,
double
centery
,
...
@@ -958,28 +960,28 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* aPad ) //{{{
...
@@ -958,28 +960,28 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* aPad ) //{{{
pad_dy
=
0
;
pad_dy
=
0
;
case
PAD_TRAPEZOID
:
case
PAD_TRAPEZOID
:
{
int
coord
[
8
]
=
{
KiROUND
(
-
pad_w
-
pad_dy
),
KiROUND
(
+
pad_h
+
pad_dx
),
KiROUND
(
-
pad_w
+
pad_dy
),
KiROUND
(
-
pad_h
-
pad_dx
),
KiROUND
(
+
pad_w
-
pad_dy
),
KiROUND
(
+
pad_h
-
pad_dx
),
KiROUND
(
+
pad_w
+
pad_dy
),
KiROUND
(
-
pad_h
+
pad_dx
),
};
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
{
int
coord
[
8
]
=
RotatePoint
(
&
coord
[
i
*
2
],
&
coord
[
i
*
2
+
1
],
aPad
->
GetOrientation
()
);
{
coord
[
i
*
2
]
+=
KiROUND
(
pad_x
);
KiROUND
(
-
pad_w
-
pad_dy
),
KiROUND
(
+
pad_h
+
pad_dx
),
coord
[
i
*
2
+
1
]
+=
KiROUND
(
pad_y
);
KiROUND
(
-
pad_w
+
pad_dy
),
KiROUND
(
-
pad_h
-
pad_dx
),
KiROUND
(
+
pad_w
-
pad_dy
),
KiROUND
(
+
pad_h
-
pad_dx
),
KiROUND
(
+
pad_w
+
pad_dy
),
KiROUND
(
-
pad_h
+
pad_dx
),
};
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
RotatePoint
(
&
coord
[
i
*
2
],
&
coord
[
i
*
2
+
1
],
aPad
->
GetOrientation
()
);
coord
[
i
*
2
]
+=
KiROUND
(
pad_x
);
coord
[
i
*
2
+
1
]
+=
KiROUND
(
pad_y
);
}
bag_flat_quad
(
layer
,
coord
[
0
],
coord
[
1
],
coord
[
2
],
coord
[
3
],
coord
[
4
],
coord
[
5
],
coord
[
6
],
coord
[
7
]
);
}
}
break
;
bag_flat_quad
(
layer
,
coord
[
0
],
coord
[
1
],
coord
[
2
],
coord
[
3
],
coord
[
4
],
coord
[
5
],
coord
[
6
],
coord
[
7
]
);
}
break
;
default:
default:
;
;
...
@@ -1043,11 +1045,11 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
...
@@ -1043,11 +1045,11 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
switch
(
item
->
Type
()
)
switch
(
item
->
Type
()
)
{
{
case
PCB_MODULE_TEXT_T
:
case
PCB_MODULE_TEXT_T
:
export_vrml_text_module
(
dynamic_cast
<
TEXTE_MODULE
*>
(
item
)
);
export_vrml_text_module
(
dynamic_cast
<
TEXTE_MODULE
*>
(
item
)
);
break
;
break
;
case
PCB_MODULE_EDGE_T
:
case
PCB_MODULE_EDGE_T
:
export_vrml_edge_module
(
dynamic_cast
<
EDGE_MODULE
*>
(
item
)
);
export_vrml_edge_module
(
dynamic_cast
<
EDGE_MODULE
*>
(
item
)
);
break
;
break
;
default:
default:
...
@@ -1078,13 +1080,13 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
...
@@ -1078,13 +1080,13 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
fname
=
vrmlm
->
m_Shape3DName
;
fname
=
vrmlm
->
m_Shape3DName
;
}
}
fname
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
fname
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
wxString
source_fname
=
fname
;
wxString
source_fname
=
fname
;
if
(
aExport3DFiles
)
// Change illegal characters in short filename
if
(
aExport3DFiles
)
// Change illegal characters in short filename
{
{
ChangeIllegalCharacters
(
fname
,
true
);
ChangeIllegalCharacters
(
fname
,
true
);
fname
=
a3D_Subdir
+
wxT
(
"/"
)
+
fname
;
fname
=
a3D_Subdir
+
wxT
(
"/"
)
+
fname
;
if
(
!
wxFileExists
(
fname
)
)
if
(
!
wxFileExists
(
fname
)
)
wxCopyFile
(
source_fname
,
fname
);
wxCopyFile
(
source_fname
,
fname
);
...
@@ -1153,12 +1155,12 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
...
@@ -1153,12 +1155,12 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
if
(
fname
.
EndsWith
(
wxT
(
"x3d"
)
)
)
if
(
fname
.
EndsWith
(
wxT
(
"x3d"
)
)
)
{
{
X3D_MODEL_PARSER
*
parser
=
new
X3D_MODEL_PARSER
(
vrmlm
);
X3D_MODEL_PARSER
*
parser
=
new
X3D_MODEL_PARSER
(
vrmlm
);
if
(
parser
)
if
(
parser
)
{
{
// embed x3d model in vrml format
// embed x3d model in vrml format
parser
->
Load
(
fname
);
parser
->
Load
(
fname
);
fprintf
(
aOutputFile
,
fprintf
(
aOutputFile
,
" children [
\n
%s ]
\n
"
,
TO_UTF8
(
parser
->
VRML_representation
()
)
);
" children [
\n
%s ]
\n
"
,
TO_UTF8
(
parser
->
VRML_representation
()
)
);
fprintf
(
aOutputFile
,
" }
\n
"
);
fprintf
(
aOutputFile
,
" }
\n
"
);
...
@@ -1187,28 +1189,7 @@ static void write_and_empty_triangle_bag( FILE* output_file, TRIANGLEBAG& triang
...
@@ -1187,28 +1189,7 @@ static void write_and_empty_triangle_bag( FILE* output_file, TRIANGLEBAG& triang
}
}
}
}
/* ExportVRML_File
* Creates the file(s) exporting current BOARD to a VRML file.
* aFullFileName = the full filename of the file to create
* aMMtoWRMLunit = the general WRML scaling factor. 1.0 to export in mm
* @param aExport3DFiles = true to copy 3D shapes in the subdir a3D_Subdir
* a3D_Subdir = sub directory where 3D shapes files are copied
* used only when aExport3DFiles == true
*/
/* Note1:
* When copying 3D shapes files, the new filename is build from
* the full path name, changing the separators by underscore.
* this is needed because files with the same shortname can exist in different directories
* Note 2:
* ExportVRML_File generates coordinates in board units (BIU) inside the file.
* (TODO: use mm inside the file)
* A general scale transform is applied to the whole file
* (1.0 to have the actual WRML unit im mm, 0.001 to have the actual WRML unit im meter
* Note 3:
* For 3D models built by a 3D modeler, the unit is 0,1 inch
* A specfic scale is applied to 3D models to convert them to BIU
*
*/
bool
PCB_EDIT_FRAME
::
ExportVRML_File
(
const
wxString
&
aFullFileName
,
bool
PCB_EDIT_FRAME
::
ExportVRML_File
(
const
wxString
&
aFullFileName
,
double
aMMtoWRMLunit
,
bool
aExport3DFiles
,
double
aMMtoWRMLunit
,
bool
aExport3DFiles
,
const
wxString
&
a3D_Subdir
)
const
wxString
&
a3D_Subdir
)
...
@@ -1218,6 +1199,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
...
@@ -1218,6 +1199,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
BOARD
*
pcb
=
GetBoard
();
BOARD
*
pcb
=
GetBoard
();
output_file
=
wxFopen
(
aFullFileName
,
wxT
(
"wt"
)
);
output_file
=
wxFopen
(
aFullFileName
,
wxT
(
"wt"
)
);
if
(
output_file
==
NULL
)
if
(
output_file
==
NULL
)
return
false
;
return
false
;
...
@@ -1227,7 +1209,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
...
@@ -1227,7 +1209,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
// Begin with the usual VRML boilerplate
// Begin with the usual VRML boilerplate
wxString
name
=
aFullFileName
;
wxString
name
=
aFullFileName
;
name
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
name
.
Replace
(
wxT
(
"
\\
"
),
wxT
(
"/"
)
);
ChangeIllegalCharacters
(
name
,
false
);
ChangeIllegalCharacters
(
name
,
false
);
fprintf
(
output_file
,
"#VRML V2.0 utf8
\n
"
fprintf
(
output_file
,
"#VRML V2.0 utf8
\n
"
"WorldInfo {
\n
"
"WorldInfo {
\n
"
...
@@ -1275,6 +1257,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
...
@@ -1275,6 +1257,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
* is 2.54 * aMMtoWRMLunit
* is 2.54 * aMMtoWRMLunit
*/
*/
double
wrml_3D_models_scaling_factor
=
2.54
*
aMMtoWRMLunit
;
double
wrml_3D_models_scaling_factor
=
2.54
*
aMMtoWRMLunit
;
// Export footprints
// Export footprints
for
(
MODULE
*
module
=
pcb
->
m_Modules
;
module
!=
0
;
module
=
module
->
Next
()
)
for
(
MODULE
*
module
=
pcb
->
m_Modules
;
module
!=
0
;
module
=
module
->
Next
()
)
export_vrml_module
(
pcb
,
module
,
output_file
,
export_vrml_module
(
pcb
,
module
,
output_file
,
...
@@ -1307,6 +1290,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
...
@@ -1307,6 +1290,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
return
true
;
return
true
;
}
}
/*
/*
* some characters cannot be used in filenames,
* some characters cannot be used in filenames,
* this function change them to "_"
* this function change them to "_"
...
@@ -1314,8 +1298,8 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
...
@@ -1314,8 +1298,8 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName,
static
void
ChangeIllegalCharacters
(
wxString
&
aFileName
,
bool
aDirSepIsIllegal
)
static
void
ChangeIllegalCharacters
(
wxString
&
aFileName
,
bool
aDirSepIsIllegal
)
{
{
if
(
aDirSepIsIllegal
)
if
(
aDirSepIsIllegal
)
aFileName
.
Replace
(
wxT
(
"/"
),
wxT
(
"_"
)
);
aFileName
.
Replace
(
wxT
(
"/"
),
wxT
(
"_"
)
);
aFileName
.
Replace
(
wxT
(
" "
),
wxT
(
"_"
)
);
aFileName
.
Replace
(
wxT
(
" "
),
wxT
(
"_"
)
);
aFileName
.
Replace
(
wxT
(
":"
),
wxT
(
"_"
)
);
aFileName
.
Replace
(
wxT
(
":"
),
wxT
(
"_"
)
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment