23 using namespace PdmsCommands;
24 using namespace PdmsObjects;
28 #define memalert(e, s) \
29 std::cerr << "Memory alert [" << __FILE__ << ", line " << __LINE__ \
30 << "] with size " << s << " : " << e.what() << std::endl;
31 #define memfail(e, s) \
36 #define PDMS_SQR(a) (a * a)
85 return valueChanges == 1;
104 return item ? item->
setValue(command, getValue()) :
false;
109 if (!isValid())
return false;
124 return item ? item->
setValue(command, getValueInWorkingUnit()) :
false;
136 if (isSet())
return false;
145 if (isSet())
return false;
146 strcpy(refname, str);
152 return ((command ==
PDMS_LAST && isSet() <= 1) || isSet() == 1);
161 if (strlen(refname) > 0) nb++;
174 if (isNameReference() && strcmp(refname, (*it)->name) == 0)
176 if (isTokenReference() && (*it)->getType() == token)
break;
188 return endCommand.
execute(item);
193 if (isNameReference()) {
195 if (item)
return false;
199 else if (isTokenReference()) {
217 if (!item)
return false;
224 return (
result !=
nullptr);
228 if (current >= 3)
return false;
233 if (coords[current].handle(t))
return true;
234 if (!coords[current].isValid())
return false;
240 if (++current >= 3)
return false;
242 coords[current].command = t;
244 coords[current].value = 0;
250 if (current < 0 || current >= 3)
return false;
255 return coords[current].handle(numvalue);
264 bool ok[3] = {
false,
false,
false};
267 int nb = getNbComponents();
268 for (
int i = 0; i < nb; i++) {
269 if (!coords[i].isValid())
return false;
270 if (ok[i])
return false;
271 switch (coords[i].command) {
274 u[0] = coords[i].getValueInWorkingUnit();
279 u[0] = -coords[i].getValueInWorkingUnit();
285 u[1] = coords[i].getValueInWorkingUnit();
290 u[1] = -coords[i].getValueInWorkingUnit();
296 u[2] = coords[i].getValueInWorkingUnit();
301 u[2] = -coords[i].getValueInWorkingUnit();
314 for (
int i = 0; i < 3; i++) {
316 if (!onlyset || coords[nb].valueChanges >= 1) nb++;
326 if (current->handle(t))
return true;
327 if (!current->isValid())
return false;
334 if (current->command)
return false;
335 current->command = t;
341 return current->handle(t);
348 if (!current)
return false;
349 return current->handle(numvalue);
353 if (!current)
return false;
354 return current->handle(str);
358 if (!
position.isValid())
return false;
359 if (ref.command ==
PDMS_WRT)
return ref.isValid();
364 if (!item)
return false;
370 if (!ref.execute(refpos))
return false;
386 if (current->handle(t))
return true;
387 if (!current->isValid())
return false;
391 if (!current || !current->isValid())
return false;
397 if (component < 0 || component >= 3)
return false;
398 if (current)
return false;
399 current = &orientation[component];
404 if (component < 0 || component >= 3)
return false;
405 current = &refs[component];
406 if (current->command)
return false;
407 current->command = t;
413 if (++component >= 3)
return false;
414 orientation[component].command = t;
422 return current ? current->handle(numvalue) :
false;
426 return current ? current->handle(str) :
false;
430 int nb = getNbComponents();
431 if (nb <= 0)
return false;
433 for (
int i = 0; i < nb; i++) {
435 if (!orientation[i].isValid())
return false;
436 if (refs[i].command ==
PDMS_WRT && !refs[i].isValid())
return false;
445 int nb = getNbComponents();
446 for (
int i = 0; i < nb; i++) {
447 if (!orientation[i].isValid())
return false;
449 switch (orientation[i].command) {
452 if (!axisFromCoords(orientation[i], x))
return false;
456 if (!axisFromCoords(orientation[i], x))
return false;
462 if (!axisFromCoords(orientation[i], y))
return false;
466 if (!axisFromCoords(orientation[i], y))
return false;
472 if (!axisFromCoords(orientation[i], z))
return false;
476 if (!axisFromCoords(orientation[i], z))
return false;
494 u[0] = cos(alpha) * cos(beta);
495 u[1] = sin(alpha) * cos(beta);
504 while (nb < 3 && orientation[nb].command) nb++;
509 if (!item)
return false;
512 for (
unsigned i = 0; i < 3; i++) {
514 if (refs[i].isValid()) {
516 if (!refs[i].execute(refori))
return false;
523 if (!getAxes(x, y, z))
return false;
530 if (!item)
return false;
538 if (!elementType)
return false;
539 if (
path.size() > 0)
return false;
540 return splitPath(str);
545 if (elementType)
return false;
571 return "Sub-structure";
594 return "Extrusion(-)";
611 switch (elementType) {
632 newElement =
new Dish;
635 newElement =
new Cone;
639 newElement =
new Box;
640 static_cast<Box *
>(newElement)->negative =
647 newElement =
new Snout;
652 static_cast<Extrusion *
>(newElement)->negative =
656 newElement =
new Loop;
664 }
catch (std::exception &nex) {
673 const char *
name = GetDefaultElementName(elementType);
679 if (
path.size() > 1) {
686 for (
unsigned i = 0; i + 1 <
path.size(); i++) {
687 mitem = mitem->
scan(
path[i].c_str());
698 if (item && !item->
push(newElement)) {
706 strcpy(newElement->
name,
path.back().c_str());
711 }
catch (std::exception &pex) {
731 if (end.isTokenReference() &&
737 if (end.isValid() && !end.execute(
result)) {
740 if (!
result)
return false;
744 if (!end.execute(
result))
return false;
762 if (i != 0)
path.push_back(std::string(str, i));
771 if (i != 0)
path.push_back(std::string(str, i));
773 return (
path.size() != 0);
778 if (!
result || !isValid())
return true;
789 }
catch (std::exception &nex) {
863 }
catch (std::exception &nex) {
873 GenericItem::GenericItem()
877 isCoordinateSystemUpToDate(false),
878 positionReference(nullptr) {
912 unsigned nb =
static_cast<unsigned>(ok[0]) +
static_cast<unsigned>(ok[1]) +
913 static_cast<unsigned>(ok[2]);
974 for (
unsigned k = 0; k < 3; k++)
986 for (
unsigned i = 0; i < 3; i++)
993 for (
unsigned k = 0; k < 3; k++) {
1005 for (
unsigned j = 0; j < 3; j++) axis[j] =
orientation[j];
1008 for (
unsigned j = 0; j < 3; j++)
1009 for (
unsigned i = 0; i < 3; i++)
1027 array.push_back(
this);
1028 }
catch (std::exception &pex) {
1038 for (std::list<DesignElement *>::iterator it =
nelements.begin();
1054 }
catch (std::exception &pex) {
1059 element->
owner =
this;
1071 for (std::list<DesignElement *>::iterator it =
nelements.begin();
1091 for (std::list<DesignElement *>::iterator eit =
elements.begin();
1096 for (std::list<GroupElement *>::iterator hit =
subhierarchy.begin();
1118 group->
owner =
this;
1122 }
catch (std::exception &pex) {
1139 }
catch (std::exception &pex) {
1149 for (std::list<GroupElement *>::iterator hit =
subhierarchy.begin();
1157 for (std::list<DesignElement *>::iterator eit =
elements.begin();
1172 for (std::list<DesignElement *>::iterator eit =
elements.begin();
1174 if (!(*eit)->convertCoordinateSystem())
return false;
1175 for (std::list<GroupElement *>::iterator hit =
subhierarchy.begin();
1177 if (!(*hit)->convertCoordinateSystem())
return false;
1185 for (std::list<DesignElement *>::iterator eit =
elements.begin();
1186 eit !=
elements.end() && !item; ++eit)
1187 item = (*eit)->
scan(str);
1188 for (std::list<GroupElement *>::iterator hit =
subhierarchy.begin();
1190 item = (*hit)->
scan(str);
1196 size_t size = items.size();
1197 for (std::list<DesignElement *>::iterator eit =
elements.begin();
1199 (*eit)->scan(t, items);
1200 for (std::list<GroupElement *>::iterator hit =
subhierarchy.begin();
1202 (*hit)->scan(t, items);
1203 return (items.size() >
size);
1209 for (
int i = 0; i < nbtabs; i++) output <<
"\t";
1227 output <<
"EQUIPMENT";
1230 output <<
"STRUCTURE";
1233 output <<
"SUBSTRUCTURE";
1236 std::cout <<
"Error : cannot write group " <<
level <<
std::endl;
1237 return std::pair<int, int>(0, 0);
1240 if (strlen(
name)) output <<
" /" <<
name;
1243 std::pair<int, int> nb(1, 0);
1245 for (std::list<GroupElement *>::const_iterator hit =
subhierarchy.begin();
1247 std::pair<int, int> n = (*hit)->write(output, nbtabs + 1);
1248 nb.first += n.first;
1249 nb.second += n.second;
1252 for (std::list<DesignElement *>::const_iterator eit =
elements.begin();
1254 std::pair<int, int> n = (*eit)->write(output, nbtabs + 1);
1255 nb.first += n.first;
1256 nb.second += n.second;
1260 for (
int i = 0; i < nbtabs; i++) output <<
"\t";
1302 for (i = 0; i < nbtabs; i++) output <<
"\t";
1303 output <<
"NEW SLCYLINDER";
1304 if (strlen(
name)) output <<
" /" <<
name;
1307 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1309 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1311 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1313 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1315 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1317 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1319 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1322 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1329 for (i = 0; i < nbtabs; i++) output <<
"\t";
1333 return std::pair<int, int>(0, 1);
1365 for (i = 0; i < nbtabs; i++) output <<
"\t";
1366 output <<
"NEW CTORUS";
1367 if (strlen(
name)) output <<
" /" <<
name;
1370 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1372 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1374 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1376 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1379 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1386 for (i = 0; i < nbtabs; i++) output <<
"\t";
1389 return std::pair<int, int>(0, 1);
1422 (inside + outside + updown);
1428 for (i = 0; i < nbtabs; i++) output <<
"\t";
1429 output <<
"NEW RTORUS";
1430 if (strlen(
name)) output <<
" /" <<
name;
1433 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1435 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1437 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1439 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1441 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1444 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1451 for (i = 0; i < nbtabs; i++) output <<
"\t";
1454 return std::pair<int, int>(0, 1);
1496 std::pair<int, int>
Dish::write(std::ostream &output,
int nbtabs)
const {
1499 for (i = 0; i < nbtabs; i++) output <<
"\t";
1500 output <<
"NEW DISH";
1501 if (strlen(
name)) output <<
" /" <<
name;
1504 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1506 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1508 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1510 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1513 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1520 for (i = 0; i < nbtabs; i++) output <<
"\t";
1523 return std::pair<int, int>(0, 1);
1562 std::pair<int, int>
Cone::write(std::ostream &output,
int nbtabs)
const {
1565 for (i = 0; i < nbtabs; i++) output <<
"\t";
1566 output <<
"NEW CONE";
1567 if (strlen(
name)) output <<
" /" <<
name;
1570 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1572 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1574 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1576 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1579 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1586 for (i = 0; i < nbtabs; i++) output <<
"\t";
1589 return std::pair<int, int>(0, 1);
1616 std::pair<int, int>
Box::write(std::ostream &output,
int nbtabs)
const {
1619 for (i = 0; i < nbtabs; i++) output <<
"\t";
1621 output <<
"NEW NBOX";
1623 output <<
"NEW BOX";
1624 if (strlen(
name)) output <<
" /" <<
name;
1627 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1629 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1631 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1633 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1636 for (i = 0; i <= nbtabs; i++) output <<
"\t";
1643 for (i = 0; i < nbtabs; i++) output <<
"\t";
1646 return std::pair<int, int>(0, 1);
1650 return std::pair<int, int>(0, 0);
1664 for (std::list<Vertex *>::iterator it =
loop.begin(); it !=
loop.end();) {
1672 std::pair<int, int>
Loop::write(std::ostream &output,
int nbtabs)
const {
1673 return std::pair<int, int>(0, 0);
1678 if (
loop)
return false;
1692 std::list<Vertex *>::const_iterator it1 =
loop->
loop.begin();
1693 std::list<Vertex *>::const_iterator it2 = it1;
1697 p += ((*it1)->v - (*it2)->v).norm();
1707 return std::pair<int, int>(0, 0);
1745 return std::pair<int, int>(0, 0);
1777 return std::pair<int, int>(0, 0);
Vector3Tpl< PointCoordinateType > CCVector3
Default 3D Vector.
float PointCoordinateType
Type of the coordinates of a (N-D) point.
void normalize()
Sets vector norm to unity.
Vector3Tpl orthogonal() const
Returns a normalized vector which is orthogonal to this one.
Vector3Tpl cross(const Vector3Tpl &v) const
Cross product.
__host__ __device__ float2 fabs(float2 v)
QTextStream & endl(QTextStream &stream)
static const std::string path
float RadiansToDegrees(int radians)
Convert radians to degrees.
bool GreaterThanEpsilon(float x)
Test a floating point number against our epsilon (a very small number).
float DegreesToRadians(int degrees)
Convert degrees to radians.
bool LessThanEpsilon(float x)
Test a floating point number against our epsilon (a very small number).