Message 1 of 11
< optimize code >Is there any way to speed up the excavation?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
static void MyGroupMyCommand () {
ads_name en1; ads_point p;
Acad::ErrorStatus es;
double L=100;
double K=10;
double Space =280;
if (acedEntSel(L"\nSelect main ARC: ", en1, p) == RTNORM )
{
AcDbObjectId id1, id2;
acdbGetObjectId(id1, en1);
AcDbObjectPointer<AcDbCurve> pEnt(id1, AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk ) {
double startParam,endParam,startDist,endDist,dTmpParam1;
AcGePoint3d startPoint,endPoint,TempPoint;
AcGeVector3d zDir,xDir,yDir,nDir,mDir,lDir;
AcGePoint3dArray pts1;
es = pEnt->getStartParam(startParam);
es = pEnt->getStartPoint(startPoint);
es = pEnt->getEndPoint(endPoint);
es = pEnt->getEndParam(endParam);
es = pEnt->getFirstDeriv(startParam,zDir);
es = pEnt->getDistAtParam(startParam, startDist);
es = pEnt->getDistAtParam(endParam, endDist);
AcGeMatrix3d curMat;
pEnt->getEcs(curMat);
yDir = AcGeVector3d(0,0,1).transformBy(curMat);
xDir = yDir.crossProduct(zDir);
AcGeMatrix3d transMat;
xDir = xDir.normalize();
yDir = yDir.normalize();
zDir = zDir.normalize();
transMat.setCoordSystem(startPoint,yDir,xDir,zDir);
AcDbObjectPointer<AcDbPolyline> Orectangle;
Orectangle.create();
Orectangle->addVertexAt(0,AcGePoint2d(-L/2,K));
Orectangle->addVertexAt(1,AcGePoint2d(+L/2,K));
Orectangle->addVertexAt(2,AcGePoint2d(+L/2,0));
Orectangle->addVertexAt(3,AcGePoint2d(-L/2,0));
Orectangle->setClosed(Adesk::kTrue);
Orectangle->transformBy(transMat);
//PostToModelSpace(Orectangle);
AcDbVoidPtrArray OArr,OgnArr;
OArr.append(Orectangle);
OgnArr.setPhysicalLength(1);
es = AcDbRegion::createFromCurves(OArr,OgnArr);
AcDbRegion *oRegion=AcDbRegion::cast((AcRxObject*)OgnArr[0]);
AcDbObjectPointer<AcDb3dSolid> OSolid;
OSolid.create();
es = OSolid->extrudeAlongPath(oRegion,pEnt);
oRegion->erase();
OSolid->setColorIndex(4);
AcDbObjectId OSolidId = PostToModelSpace(OSolid);
double len= endDist - startDist;
int nn =int (len / Space);
double startlen= (len - nn* Space)* 0.5;
TempPoint=startPoint;
for (int k = 0; k < nn+1; k++)
{
es = pEnt->getParamAtDist(startlen+(k * 300),dTmpParam1);
es = pEnt->getPointAtParam(dTmpParam1,TempPoint);
es = pEnt->getFirstDeriv(dTmpParam1,nDir);
es = pEnt->getSecondDeriv(dTmpParam1,mDir);
nDir = nDir.normalize();
mDir = mDir.normalize();
lDir = nDir.crossProduct(mDir);
AcGeMatrix3d MtransMat;
MtransMat.setCoordSystem(TempPoint,lDir,mDir*-1,nDir);
AcGeMatrix3d mat;
AcGeVector3d vec;
AcDbObjectPointer<AcDb3dSolid> LsSolid1;LsSolid1.create();
LsSolid1->createFrustum(K*4, 6, 6, 6);
mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);
LsSolid1->transformBy(mat);
vec = AcGeVector3d (L/2-10,0,0);
mat.setToTranslation(vec);
LsSolid1->transformBy(mat);
LsSolid1->transformBy(MtransMat);
AcDbObjectPointer<AcDb3dSolid> LsSolid2;LsSolid2.create();
LsSolid2->createFrustum(K*4, 6, 6, 6);
mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);
LsSolid2->transformBy(mat);
vec = AcGeVector3d (10-L/2,0,0);
mat.setToTranslation(vec);
LsSolid2->transformBy(mat);
LsSolid2->transformBy(MtransMat);
AcDbObjectPointer<AcDb3dSolid>OSolid(OSolidId,AcDb::kForWrite);
OSolid->booleanOper(AcDb::kBoolSubtract,LsSolid1);
assert(LsSolid1->isNull());LsSolid1->erase();LsSolid1->close();
OSolid->booleanOper(AcDb::kBoolSubtract,LsSolid2);
assert(LsSolid2->isNull());LsSolid2->erase();LsSolid2->close();
}
}
}
}