Hello everybody!
In the last days i often consulted this forum and now i want to give something back...
// AcBr used to generate mesh:
/////////////////////////////////////////////////////////////////////////////////////////////
//cast into Brep entity
AcBrEntity* pBrEnt = new AcBrBrep();
AcDbObjectIdArray objIdList;
AcDb::SubentType subType = AcDb::kNullSubentType;
AcDbFullSubentPath subPath;
AcDb3dSolid* pSolid = NULL;
AcBr::ErrorStatus returnValue = AcBr::eOk;
objIdList.append(ObjId);
if ((pSolid = AcDb3dSolid::cast(pObj)) != NULL)
{
subPath = kNullSubent;
subPath.objectIds() = objIdList;
}
returnValue = ((AcBrBrep*)pBrEnt)->set(subPath);
if (returnValue != AcBr::eOk)
{
acutPrintf(ACRX_T("\n Error in AcBrEntity::set:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
delete pBrEnt;
return false;
}
acutPrintf(ACRX_T("\ncreated BrEnt\n"));
///////////////////////////////////////
// Make mesh control and MeshFilter(Entity and refinement) and then GENERATE mesh
AcBrMesh2dControl meshCtrl;
meshCtrl.setMinSubdivisionsInU();
meshCtrl.setMinSubdivisionsInV();
meshCtrl.setMaxSubdivisions();
meshCtrl.setMaxNodeSpacing();
meshCtrl.setAngTol(Winkelfehler * kDeg2Rad);
meshCtrl.setDistTol(0.8);
meshCtrl.setMaxAspectRatio(0);
meshCtrl.setElementShape(AcBr::kAllTriangles);
AcBrMesh2dFilter meshFilter;
meshFilter.insert(make_pair((const AcBrEntity*&) pBrEnt, (const AcBrMesh2dControl)meshCtrl));
AcBrMesh2d faceMesh;
if ((returnValue = faceMesh.generate(meshFilter)) != eOk) {
acutPrintf(ACRX_T("\n Error in AcBrMesh2d::generate:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
}
/////////////////////////////////////////
// make a global element traverser
AcBrMesh2dElement2dTraverser meshElemTrav;
returnValue = meshElemTrav.setMesh(faceMesh);
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrMesh2dElement2dTraverser::setMesh:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
return false;
}
// traverse through the elements
while (!meshElemTrav.done() && (returnValue == AcBr::eOk) && !acedUsrBrk()) {
// convert the nodes into a 3d point array for AcDbPolyline
AcBrElement2dNodeTraverser elemNodeTrav;
returnValue = elemNodeTrav.setElement(meshElemTrav);
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrElement2dNodeTraverser::setElement:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
return false;
}
while (!elemNodeTrav.done() && (returnValue == AcBr::eOk)) {
AcBrNode node;
returnValue = elemNodeTrav.getNode(node);
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrElement2dNodeTraverser::getNode:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
return false;
}
// add the point from the patch to FEDaten
AcGePoint3d temp;
node.getPoint(temp);
FeDaten.Patches.append(FeDaten.AddPunkte(temp));
TEMPCOUNT++;
returnValue = elemNodeTrav.next();
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrElement2dNodeTraverser::next:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
return false;
}
} // end element while
returnValue = meshElemTrav.next();
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrMesh2dElement2dTraverser::next:"));
acutPrintf(ACRX_T(" AutoCAD Error Code: %d\n"), returnValue);
return false;
}
} // end mesh while
delete pBrEnt;
////////////////////////////////////////////////////////////////////////////////////////////////
this is the code of a mesh generator in arx if you wonder how the "brmesh " function in the utils/brep/samples/ works, this is what you should try for your programm
PS: the ObjId and Wnkelfehler (angleerror) ar just a acdbobjectID and a double...