2025.6.1
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/***********************************************************************************************************************
|
||||
*
|
||||
* Copyright (c) 2010 - 2022 by Tech Soft 3D, Inc.
|
||||
* Copyright (c) 2010 - 2025 by Tech Soft 3D, Inc.
|
||||
* The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret
|
||||
* as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event
|
||||
* of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <A3DSDKIncludes.h>
|
||||
#include "PRC2XML.h"
|
||||
|
||||
|
||||
#include <map>
|
||||
|
||||
//######################################################################################################################
|
||||
#define READMAXBIGSTRING 65536
|
||||
@@ -20,7 +20,7 @@ A3DUTF8Char gbigstring[READMAXBIGSTRING]; // 64 kB buffer is OK to store big str
|
||||
A3DUns32 gnAllocatedStrings = 0;
|
||||
|
||||
//######################################################################################################################
|
||||
void _SetDoubleAttribute(_TiXmlElement* psElement, const char* name, double val)
|
||||
void setDoubleAttribute(_TiXmlElement* psElement, const char* name, double val)
|
||||
{
|
||||
// max size of one double: "%.15 " 13+1+15+1=30
|
||||
A3DUTF8Char* pc = gbigstring;
|
||||
@@ -53,15 +53,73 @@ const _TiXmlElement* _FirstChildByAttribute(_TiXmlElement* psElement, const A3DU
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
void _SetAttributePtr(_TiXmlElement* psElement, const A3DUTF8Char* pcAttribName, void* pValue)
|
||||
unsigned int getPRC2XMLID(const A3DEntity* pElement)
|
||||
{
|
||||
A3DUTF8Char buffer[64];
|
||||
sprintf_s(buffer,sizeof(buffer)-1, "%p", pValue);
|
||||
psElement->SetAttribute(pcAttribName, buffer);
|
||||
static std::map<const A3DEntity*, unsigned> mapElementIds;
|
||||
auto itFound = mapElementIds.find(pElement);
|
||||
if (itFound == mapElementIds.end())
|
||||
{
|
||||
// Just use index in export as unique identifier within the xml
|
||||
unsigned uiUniqueId = (unsigned)mapElementIds.size();
|
||||
mapElementIds[pElement] = uiUniqueId;
|
||||
return uiUniqueId;
|
||||
}
|
||||
else
|
||||
return itFound->second;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseDoubles(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DDouble* pd, _TiXmlElement* setting)
|
||||
void setAttributePtr(const A3DUTF8Char* pcAttribName, const A3DEntity* pElement, _TiXmlElement* setting)
|
||||
{
|
||||
setting->SetAttribute(pcAttribName, getPRC2XMLID(pElement));
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
void setAttributePRC2XMLID(const A3DEntity* pElement, _TiXmlElement* setting)
|
||||
{
|
||||
setAttributePtr("uiPRC2XML_ID", pElement, setting);
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
A3DStatus traversePRC2XMLIDs(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DEntity** pp, _TiXmlElement* setting)
|
||||
{
|
||||
if (uiSize > 0)
|
||||
{
|
||||
A3DUns32 ui = 0;
|
||||
_TiXmlElement* uints = new _TiXmlElement(name);
|
||||
uints->SetAttribute("size", (int)uiSize);
|
||||
|
||||
// max size of one uint: "%d " 14+1=15
|
||||
A3DUns32 uiFormat = 15;
|
||||
A3DUTF8Char* pc = NULL;
|
||||
if (uiFormat * uiSize > READMAXBIGSTRING)
|
||||
{
|
||||
pc = (A3DUTF8Char*)malloc(size_t(uiSize * uiFormat) * sizeof(A3DUTF8Char));
|
||||
pc[0] = 0;
|
||||
gnAllocatedStrings++;
|
||||
}
|
||||
else
|
||||
pc = gbigstring;
|
||||
|
||||
size_t uiNext = 0;
|
||||
for (ui = 0; ui < uiSize; ++ui)
|
||||
{
|
||||
int iwritten = sprintf(pc + uiNext, "%u ", getPRC2XMLID(pp[ui]));
|
||||
uiNext += size_t(iwritten);
|
||||
}
|
||||
pc[uiNext] = 0;
|
||||
|
||||
uints->SetAttribute("data", pc);
|
||||
setting->LinkEndChild(uints);
|
||||
|
||||
if (uiFormat * uiSize > READMAXBIGSTRING)
|
||||
free(pc);
|
||||
}
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
A3DStatus traverseDoubles(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DDouble* pd, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
@@ -109,7 +167,7 @@ int traverseDoubles(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DDou
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseUInts(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns32* pui, _TiXmlElement* setting)
|
||||
A3DStatus traverseUInts(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns32* pui, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
@@ -147,7 +205,7 @@ int traverseUInts(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns32
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseUChars(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns8* pui, _TiXmlElement* setting)
|
||||
A3DStatus traverseUChars(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns8* pui, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
@@ -185,7 +243,7 @@ int traverseUChars(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DUns8
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseBools(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DBool* pb, _TiXmlElement* setting)
|
||||
A3DStatus traverseBools(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DBool* pb, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
@@ -223,67 +281,28 @@ int traverseBools(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DBool*
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseVoids(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DVoid** pp, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
A3DUns32 ui = 0;
|
||||
_TiXmlElement* uints = new _TiXmlElement(name);
|
||||
uints->SetAttribute("size", (int)uiSize);
|
||||
|
||||
// max size of one void: "%p ":8
|
||||
A3DUns32 uiFormat = 8;
|
||||
A3DUTF8Char* pc = NULL;
|
||||
if(uiFormat*uiSize > READMAXBIGSTRING)
|
||||
{
|
||||
pc = (A3DUTF8Char*) malloc(size_t(uiSize * uiFormat) * sizeof(A3DUTF8Char));
|
||||
pc[0] = 0;
|
||||
gnAllocatedStrings++;
|
||||
}
|
||||
else
|
||||
pc = gbigstring;
|
||||
|
||||
size_t uiNext = 0;
|
||||
for(ui = 0; ui < uiSize; ++ui)
|
||||
{
|
||||
const A3DVoid* p = pp[ui];
|
||||
int iwritten = sprintf(pc+uiNext, "%p ", (void*) p);
|
||||
uiNext += size_t(iwritten);
|
||||
}
|
||||
pc[uiNext]=0;
|
||||
|
||||
uints->SetAttribute("data", pc);
|
||||
setting->LinkEndChild(uints);
|
||||
|
||||
if(uiFormat*uiSize > READMAXBIGSTRING)
|
||||
free(pc);
|
||||
}
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traversePoint(const A3DUTF8Char* name, const A3DVector3dData& sData, _TiXmlElement* setting)
|
||||
A3DStatus traversePoint(const A3DUTF8Char* name, const A3DVector3dData& sData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* pt = new _TiXmlElement(name);
|
||||
_SetDoubleAttribute(pt, "m_dX", sData.m_dX);
|
||||
_SetDoubleAttribute(pt, "m_dY", sData.m_dY);
|
||||
_SetDoubleAttribute(pt, "m_dZ", sData.m_dZ);
|
||||
setDoubleAttribute(pt, "m_dX", sData.m_dX);
|
||||
setDoubleAttribute(pt, "m_dY", sData.m_dY);
|
||||
setDoubleAttribute(pt, "m_dZ", sData.m_dZ);
|
||||
setting->LinkEndChild(pt);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traversePoint2d(const A3DUTF8Char* name, const A3DVector2dData& sData, _TiXmlElement* setting)
|
||||
A3DStatus traversePoint2d(const A3DUTF8Char* name, const A3DVector2dData& sData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* pt = new _TiXmlElement(name);
|
||||
_SetDoubleAttribute(pt, "m_dX", sData.m_dX);
|
||||
_SetDoubleAttribute(pt, "m_dY", sData.m_dY);
|
||||
setDoubleAttribute(pt, "m_dX", sData.m_dX);
|
||||
setDoubleAttribute(pt, "m_dY", sData.m_dY);
|
||||
setting->LinkEndChild(pt);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traversePoints(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DVector3dData* pv, _TiXmlElement* setting)
|
||||
A3DStatus traversePoints(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DVector3dData* pv, _TiXmlElement* setting)
|
||||
{
|
||||
if(uiSize > 0)
|
||||
{
|
||||
@@ -304,63 +323,63 @@ int traversePoints(const A3DUTF8Char* name, const A3DUns32 uiSize, const A3DVect
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseInterval(const A3DIntervalData* pData, _TiXmlElement* setting)
|
||||
A3DStatus traverseInterval(const A3DIntervalData* pData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* extent1d = new _TiXmlElement("A3DIntervalData");
|
||||
_SetDoubleAttribute(extent1d, "m_dMin", pData->m_dMin);
|
||||
_SetDoubleAttribute(extent1d, "m_dMax", pData->m_dMax);
|
||||
setDoubleAttribute(extent1d, "m_dMin", pData->m_dMin);
|
||||
setDoubleAttribute(extent1d, "m_dMax", pData->m_dMax);
|
||||
setting->LinkEndChild(extent1d);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseDomain(const A3DDomainData* pData, _TiXmlElement* setting)
|
||||
A3DStatus traverseDomain(const A3DDomainData* pData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* extent2d = new _TiXmlElement("A3DDomainData");
|
||||
_SetDoubleAttribute(extent2d, "m_sMin.m_dX", pData->m_sMin.m_dX);
|
||||
_SetDoubleAttribute(extent2d, "m_sMin.m_dY", pData->m_sMin.m_dY);
|
||||
_SetDoubleAttribute(extent2d, "m_sMax.m_dX", pData->m_sMax.m_dX);
|
||||
_SetDoubleAttribute(extent2d, "m_sMax.m_dY", pData->m_sMax.m_dY);
|
||||
setDoubleAttribute(extent2d, "m_sMin.m_dX", pData->m_sMin.m_dX);
|
||||
setDoubleAttribute(extent2d, "m_sMin.m_dY", pData->m_sMin.m_dY);
|
||||
setDoubleAttribute(extent2d, "m_sMax.m_dX", pData->m_sMax.m_dX);
|
||||
setDoubleAttribute(extent2d, "m_sMax.m_dY", pData->m_sMax.m_dY);
|
||||
setting->LinkEndChild(extent2d);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseBoundingBox(const A3DBoundingBoxData* pData, _TiXmlElement* setting)
|
||||
A3DStatus traverseBoundingBox(const A3DBoundingBoxData* pData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* extent3d = new _TiXmlElement("A3DBoundingBoxData");
|
||||
_SetDoubleAttribute(extent3d, "m_sMin.m_dX", pData->m_sMin.m_dX);
|
||||
_SetDoubleAttribute(extent3d, "m_sMin.m_dY", pData->m_sMin.m_dY);
|
||||
_SetDoubleAttribute(extent3d, "m_sMin.m_dZ", pData->m_sMin.m_dZ);
|
||||
_SetDoubleAttribute(extent3d, "m_sMax.m_dX", pData->m_sMax.m_dX);
|
||||
_SetDoubleAttribute(extent3d, "m_sMax.m_dY", pData->m_sMax.m_dY);
|
||||
_SetDoubleAttribute(extent3d, "m_sMax.m_dZ", pData->m_sMax.m_dZ);
|
||||
setDoubleAttribute(extent3d, "m_sMin.m_dX", pData->m_sMin.m_dX);
|
||||
setDoubleAttribute(extent3d, "m_sMin.m_dY", pData->m_sMin.m_dY);
|
||||
setDoubleAttribute(extent3d, "m_sMin.m_dZ", pData->m_sMin.m_dZ);
|
||||
setDoubleAttribute(extent3d, "m_sMax.m_dX", pData->m_sMax.m_dX);
|
||||
setDoubleAttribute(extent3d, "m_sMax.m_dY", pData->m_sMax.m_dY);
|
||||
setDoubleAttribute(extent3d, "m_sMax.m_dZ", pData->m_sMax.m_dZ);
|
||||
setting->LinkEndChild(extent3d);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseParam(const A3DParameterizationData* pData, _TiXmlElement* setting)
|
||||
A3DStatus traverseParam(const A3DParameterizationData* pData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* param = new _TiXmlElement("A3DParameterizationData");
|
||||
_SetDoubleAttribute(param, "m_sInterval.m_dMin", pData->m_sInterval.m_dMin);
|
||||
_SetDoubleAttribute(param, "m_sInterval.m_dMax", pData->m_sInterval.m_dMax);
|
||||
_SetDoubleAttribute(param, "m_dCoeffA", pData->m_dCoeffA);
|
||||
_SetDoubleAttribute(param, "m_dCoeffB", pData->m_dCoeffB);
|
||||
setDoubleAttribute(param, "m_sInterval.m_dMin", pData->m_sInterval.m_dMin);
|
||||
setDoubleAttribute(param, "m_sInterval.m_dMax", pData->m_sInterval.m_dMax);
|
||||
setDoubleAttribute(param, "m_dCoeffA", pData->m_dCoeffA);
|
||||
setDoubleAttribute(param, "m_dCoeffB", pData->m_dCoeffB);
|
||||
setting->LinkEndChild(param);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
|
||||
//######################################################################################################################
|
||||
int traverseUVParam(const A3DUVParameterizationData* pData, _TiXmlElement* setting)
|
||||
A3DStatus traverseUVParam(const A3DUVParameterizationData* pData, _TiXmlElement* setting)
|
||||
{
|
||||
_TiXmlElement* param = new _TiXmlElement("A3DUVParameterizationData");
|
||||
traverseDomain(&pData->m_sUVDomain, param);
|
||||
_SetDoubleAttribute(param, "m_dUCoeffA", pData->m_dUCoeffA);
|
||||
_SetDoubleAttribute(param, "m_dUCoeffB", pData->m_dUCoeffB);
|
||||
_SetDoubleAttribute(param, "m_dVCoeffA", pData->m_dVCoeffA);
|
||||
_SetDoubleAttribute(param, "m_dVCoeffB", pData->m_dVCoeffB);
|
||||
_SetDoubleAttribute(param, "m_bSwapUV", (int)pData->m_bSwapUV);
|
||||
setDoubleAttribute(param, "m_dUCoeffA", pData->m_dUCoeffA);
|
||||
setDoubleAttribute(param, "m_dUCoeffB", pData->m_dUCoeffB);
|
||||
setDoubleAttribute(param, "m_dVCoeffA", pData->m_dVCoeffA);
|
||||
setDoubleAttribute(param, "m_dVCoeffB", pData->m_dVCoeffB);
|
||||
setDoubleAttribute(param, "m_bSwapUV", (int)pData->m_bSwapUV);
|
||||
setting->LinkEndChild(param);
|
||||
return A3D_SUCCESS;
|
||||
}
|
||||
@@ -394,7 +413,7 @@ A3DStatus traverseCartesianTransformation(const A3DMiscCartesianTransformation*
|
||||
}
|
||||
else
|
||||
{
|
||||
setting->SetAttribute("error", iRet);
|
||||
setting->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
|
||||
}
|
||||
}
|
||||
return A3D_SUCCESS;
|
||||
@@ -414,7 +433,7 @@ A3DStatus traverseGeneralTransformation(const A3DMiscGeneralTransformation* pTrs
|
||||
}
|
||||
else
|
||||
{
|
||||
trsf->SetAttribute("error", iRet);
|
||||
trsf->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
|
||||
}
|
||||
setting->LinkEndChild(trsf);
|
||||
return A3D_SUCCESS;
|
||||
@@ -441,7 +460,7 @@ A3DStatus traverseTransformation(const A3DMiscTransformation* pTransfo3d, _TiXml
|
||||
}
|
||||
else
|
||||
{
|
||||
trsf->SetAttribute("error", iRet);
|
||||
trsf->SetAttribute("error", A3DMiscGetErrorMsg(iRet));
|
||||
}
|
||||
|
||||
setting->LinkEndChild(trsf);
|
||||
|
||||
Reference in New Issue
Block a user