<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic &amp;lt; optimize code &amp;gt;Is there any way to speed up the excavation? in ObjectARX Forum</title>
    <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389578#M2314</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="cpp"&gt;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&amp;lt;AcDbCurve&amp;gt; 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-&amp;gt;getStartParam(startParam);		 
				es = pEnt-&amp;gt;getStartPoint(startPoint);		 
				es = pEnt-&amp;gt;getEndPoint(endPoint);			 
				es = pEnt-&amp;gt;getEndParam(endParam);
				es = pEnt-&amp;gt;getFirstDeriv(startParam,zDir);	 
				es = pEnt-&amp;gt;getDistAtParam(startParam, startDist);
				es = pEnt-&amp;gt;getDistAtParam(endParam, endDist);

				AcGeMatrix3d curMat;
				pEnt-&amp;gt;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&amp;lt;AcDbPolyline&amp;gt; Orectangle;
				Orectangle.create();
				Orectangle-&amp;gt;addVertexAt(0,AcGePoint2d(-L/2,K));
				Orectangle-&amp;gt;addVertexAt(1,AcGePoint2d(+L/2,K));
				Orectangle-&amp;gt;addVertexAt(2,AcGePoint2d(+L/2,0));
				Orectangle-&amp;gt;addVertexAt(3,AcGePoint2d(-L/2,0));
				Orectangle-&amp;gt;setClosed(Adesk::kTrue);		 

				Orectangle-&amp;gt;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&amp;lt;AcDb3dSolid&amp;gt; OSolid;

				OSolid.create();
				es = OSolid-&amp;gt;extrudeAlongPath(oRegion,pEnt);
				oRegion-&amp;gt;erase();

				OSolid-&amp;gt;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 &amp;lt; nn+1; k++)
				{
					es = pEnt-&amp;gt;getParamAtDist(startlen+(k * 300),dTmpParam1);
					es = pEnt-&amp;gt;getPointAtParam(dTmpParam1,TempPoint);
					es = pEnt-&amp;gt;getFirstDeriv(dTmpParam1,nDir);
					es = pEnt-&amp;gt;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&amp;lt;AcDb3dSolid&amp;gt; LsSolid1;LsSolid1.create();
					LsSolid1-&amp;gt;createFrustum(K*4, 6, 6, 6);
					mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);  
					LsSolid1-&amp;gt;transformBy(mat);
					vec = AcGeVector3d (L/2-10,0,0);
					mat.setToTranslation(vec);  
					LsSolid1-&amp;gt;transformBy(mat);
					LsSolid1-&amp;gt;transformBy(MtransMat);


					AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid2;LsSolid2.create();
					LsSolid2-&amp;gt;createFrustum(K*4, 6, 6, 6);
					mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);  
					LsSolid2-&amp;gt;transformBy(mat);
					vec = AcGeVector3d (10-L/2,0,0);
					mat.setToTranslation(vec);  
					LsSolid2-&amp;gt;transformBy(mat);
					LsSolid2-&amp;gt;transformBy(MtransMat);

					AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt;OSolid(OSolidId,AcDb::kForWrite);
					OSolid-&amp;gt;booleanOper(AcDb::kBoolSubtract,LsSolid1);
					assert(LsSolid1-&amp;gt;isNull());LsSolid1-&amp;gt;erase();LsSolid1-&amp;gt;close();
					OSolid-&amp;gt;booleanOper(AcDb::kBoolSubtract,LsSolid2);
					assert(LsSolid2-&amp;gt;isNull());LsSolid2-&amp;gt;erase();LsSolid2-&amp;gt;close();

		      }
		}
	}
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 30 Aug 2022 07:58:22 GMT</pubDate>
    <dc:creator>463017170</dc:creator>
    <dc:date>2022-08-30T07:58:22Z</dc:date>
    <item>
      <title>&lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389578#M2314</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="cpp"&gt;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&amp;lt;AcDbCurve&amp;gt; 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-&amp;gt;getStartParam(startParam);		 
				es = pEnt-&amp;gt;getStartPoint(startPoint);		 
				es = pEnt-&amp;gt;getEndPoint(endPoint);			 
				es = pEnt-&amp;gt;getEndParam(endParam);
				es = pEnt-&amp;gt;getFirstDeriv(startParam,zDir);	 
				es = pEnt-&amp;gt;getDistAtParam(startParam, startDist);
				es = pEnt-&amp;gt;getDistAtParam(endParam, endDist);

				AcGeMatrix3d curMat;
				pEnt-&amp;gt;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&amp;lt;AcDbPolyline&amp;gt; Orectangle;
				Orectangle.create();
				Orectangle-&amp;gt;addVertexAt(0,AcGePoint2d(-L/2,K));
				Orectangle-&amp;gt;addVertexAt(1,AcGePoint2d(+L/2,K));
				Orectangle-&amp;gt;addVertexAt(2,AcGePoint2d(+L/2,0));
				Orectangle-&amp;gt;addVertexAt(3,AcGePoint2d(-L/2,0));
				Orectangle-&amp;gt;setClosed(Adesk::kTrue);		 

				Orectangle-&amp;gt;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&amp;lt;AcDb3dSolid&amp;gt; OSolid;

				OSolid.create();
				es = OSolid-&amp;gt;extrudeAlongPath(oRegion,pEnt);
				oRegion-&amp;gt;erase();

				OSolid-&amp;gt;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 &amp;lt; nn+1; k++)
				{
					es = pEnt-&amp;gt;getParamAtDist(startlen+(k * 300),dTmpParam1);
					es = pEnt-&amp;gt;getPointAtParam(dTmpParam1,TempPoint);
					es = pEnt-&amp;gt;getFirstDeriv(dTmpParam1,nDir);
					es = pEnt-&amp;gt;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&amp;lt;AcDb3dSolid&amp;gt; LsSolid1;LsSolid1.create();
					LsSolid1-&amp;gt;createFrustum(K*4, 6, 6, 6);
					mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);  
					LsSolid1-&amp;gt;transformBy(mat);
					vec = AcGeVector3d (L/2-10,0,0);
					mat.setToTranslation(vec);  
					LsSolid1-&amp;gt;transformBy(mat);
					LsSolid1-&amp;gt;transformBy(MtransMat);


					AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid2;LsSolid2.create();
					LsSolid2-&amp;gt;createFrustum(K*4, 6, 6, 6);
					mat.setToRotation(1.5707963268,AcGeVector3d::kXAxis,AcGePoint3d::kOrigin);  
					LsSolid2-&amp;gt;transformBy(mat);
					vec = AcGeVector3d (10-L/2,0,0);
					mat.setToTranslation(vec);  
					LsSolid2-&amp;gt;transformBy(mat);
					LsSolid2-&amp;gt;transformBy(MtransMat);

					AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt;OSolid(OSolidId,AcDb::kForWrite);
					OSolid-&amp;gt;booleanOper(AcDb::kBoolSubtract,LsSolid1);
					assert(LsSolid1-&amp;gt;isNull());LsSolid1-&amp;gt;erase();LsSolid1-&amp;gt;close();
					OSolid-&amp;gt;booleanOper(AcDb::kBoolSubtract,LsSolid2);
					assert(LsSolid2-&amp;gt;isNull());LsSolid2-&amp;gt;erase();LsSolid2-&amp;gt;close();

		      }
		}
	}
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 07:58:22 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389578#M2314</guid>
      <dc:creator>463017170</dc:creator>
      <dc:date>2022-08-30T07:58:22Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389649#M2315</link>
      <description>&lt;P&gt;maybe use a transaction? Not sure if that would help&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 07:17:43 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389649#M2315</guid>
      <dc:creator>daniel_cadext</dc:creator>
      <dc:date>2022-08-30T07:17:43Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389796#M2316</link>
      <description>&lt;P&gt;I have three suggestions to optimize. But they won't yield a considerable performance boost:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1.) Only open objects &lt;FONT face="courier new,courier"&gt;kForWrite&lt;/FONT&gt; if you really need to modify them:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;AcDbObjectPointer&amp;lt;AcDbCurve&amp;gt; pEnt(id1, AcDb::kForRead); // Opening kForRead is enough&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2.) You can move&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid1, LsSolid2;&lt;/FONT&gt; outside of the for loop:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid1; LsSolid1.create();
AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid2; LsSolid2.create(); // moved outside the for-loop
for (int k = 0; k &amp;lt; nn + 1; k++)
}
  ...
{
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You don't append them to the database so you don't need to&amp;nbsp;&lt;FONT face="courier new,courier"&gt;erase()&lt;FONT face="arial,helvetica,sans-serif"&gt;and&lt;/FONT&gt; close()&lt;/FONT&gt; them.&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;// assert(LsSolid2-&amp;gt;isNull()); LsSolid2-&amp;gt;erase(); LsSolid2-&amp;gt;close();&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;3.) If you want to apply three transformation matrices to an entity it is more efficient to calculate a final transformation matrix&amp;nbsp;&lt;FONT face="courier new,courier"&gt;M=m3*m2*m1&lt;/FONT&gt;&lt;SPAN&gt; and transform once with &lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;entity-&amp;gt;transformBy(M)&lt;/FONT&gt;&lt;SPAN&gt; than transforming with &lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;m1,m2&lt;/FONT&gt;&lt;SPAN&gt; and &lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;m3&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;individually:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;LsSolid1-&amp;gt;createFrustum(K * 4, 6, 6, 6);
mat.setToRotation(1.5707963268, AcGeVector3d::kXAxis, AcGePoint3d::kOrigin);
AcGeMatrix3d MatFinal = mat;	// Calculate a final transformation matrix
vec = AcGeVector3d(L / 2 - 10, 0, 0);
mat.setToTranslation(vec);
MatFinal = MtransMat * mat * MatFinal;
LsSolid1-&amp;gt;transformBy(MatFinal); // and transform once with MatFinal

LsSolid2-&amp;gt;createFrustum(K * 4, 6, 6, 6);
mat.setToRotation(1.5707963268, AcGeVector3d::kXAxis, AcGePoint3d::kOrigin);
MatFinal = mat;			// Calculate a final transformation matrix
vec = AcGeVector3d(10 - L / 2, 0, 0);
mat.setToTranslation(vec);
MatFinal = MtransMat * mat * MatFinal;
LsSolid2-&amp;gt;transformBy(MatFinal); // and transform once with MatFinal
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note: Your calculation of &lt;FONT face="courier new,courier"&gt;lDir, nDir, mDir&lt;/FONT&gt; is OK for arcs. But in general &lt;FONT face="courier new,courier"&gt;mDir&lt;/FONT&gt; is not perpendicular to &lt;FONT face="courier new,courier"&gt;nDir -&lt;/FONT&gt;&amp;nbsp;i.e. if your curve is a spline. This calculation works as long as &lt;FONT face="courier new,courier"&gt;mDir&amp;nbsp;&lt;/FONT&gt;is not null:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;lDir = nDir.crossProduct(mDir);
lDir.normalize();
mDir = nDir.crossProduct(lDir); // mDir is not always perpendicular to nDir!
nDir.normalize();
mDir.normalize();
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 08:35:56 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389796#M2316</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-08-30T08:35:56Z</dc:date>
    </item>
    <item>
      <title>回复： &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389867#M2317</link>
      <description>&lt;P&gt;booleanOper&amp;nbsp; &amp;nbsp;&amp;nbsp;This is slow&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 08:51:16 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11389867#M2317</guid>
      <dc:creator>463017170</dc:creator>
      <dc:date>2022-08-30T08:51:16Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390099#M2318</link>
      <description>&lt;P&gt;Yes, &lt;FONT face="courier new,courier"&gt;booleanOper()&lt;/FONT&gt; is the call that takes the most time. But if you want a boolean subtraction to be performed on a 3DSOLID there is no alternative.&lt;BR /&gt;It might help to make sure that the cylinders that you subtract "clearly" pierce the surfaces of the 3DSOLID at both ends. So make them "long enough". If the ends of the cylinders are close to the bounding surface of the 3DSOLID the calculation might require greater accuracy internally.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If the region that you extrude along the path is always a rectangle sized X * Z you might try this:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Create an&amp;nbsp;&lt;FONT face="courier new,courier"&gt;AcDbSweptSurface&lt;/FONT&gt; using sweeping just a line with length X along the path.&lt;/LI&gt;
&lt;LI&gt;Subtract the cylinders with &amp;nbsp;&lt;FONT face="courier new,courier"&gt;AcDbSurface::booleanSubtract (AcDb3dSolid*, AcDbSurface*&amp;amp;)&amp;nbsp;&lt;BR /&gt;&lt;/FONT&gt;The cylinders should "clearly" pierce the surface. So make them "long enough".&lt;FONT face="courier new,courier"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;Thicken the surface with&amp;nbsp;&lt;FONT face="courier new,courier"&gt;AcDbSurface::thicken(Z,...)&lt;/FONT&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This &lt;EM&gt;might&lt;/EM&gt; run faster because the boolean operation involves less calculations for a surface than for a 3DSOLID.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 10:41:00 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390099#M2318</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-08-30T10:41:00Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390159#M2319</link>
      <description>&lt;P&gt;Do not understand, can write an example, thank you!&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 11:17:04 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390159#M2319</guid>
      <dc:creator>463017170</dc:creator>
      <dc:date>2022-08-30T11:17:04Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390851#M2320</link>
      <description>&lt;P&gt;Regarding my 1st suggestion: Looking at your code I see that you are already making the cylinders "long enough". The length&amp;nbsp;K*4 makes sure that they pierce the solid, which is K thick. So just forget this one.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regarding my 2nd suggestion:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Currently you create an AcDb3dSolid by extruding a rectangle and subtract cylinders from it.&lt;/P&gt;
&lt;P&gt;My idea is to create an &lt;FONT face="courier new,courier"&gt;AcDbSweptSurface&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;by sweeping a line, subtract the cylinder from it and finally create the AcDb3dSolid by thicken() the &lt;FONT face="courier new,courier"&gt;AcDbSweptSurface&lt;/FONT&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Sample Code:&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;#include &amp;lt;dbsweptsurf.h&amp;gt;

void cmdOptimizeCommandSurf() {
	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&amp;lt;AcDbCurve&amp;gt; pEnt(id1, AcDb::kForRead); // Opening kForRead is enough
		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-&amp;gt;getStartParam(startParam);
			es = pEnt-&amp;gt;getStartPoint(startPoint);
			es = pEnt-&amp;gt;getEndPoint(endPoint);
			es = pEnt-&amp;gt;getEndParam(endParam);
			es = pEnt-&amp;gt;getFirstDeriv(startParam, zDir);
			es = pEnt-&amp;gt;getDistAtParam(startParam, startDist);
			es = pEnt-&amp;gt;getDistAtParam(endParam, endDist);

			AcGeMatrix3d curMat;
			pEnt-&amp;gt;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&amp;lt;AcDbPolyline&amp;gt; Oline;
			Oline.create();
			Oline-&amp;gt;addVertexAt(0, AcGePoint2d(-L / 2, 0));
			Oline-&amp;gt;addVertexAt(1, AcGePoint2d(+L / 2, 0));
			Oline-&amp;gt;transformBy(transMat);

			AcDbSweptSurface *sweptSurface = new AcDbSweptSurface;
			AcDbSweepOptions sweepOptions;
			es = sweptSurface-&amp;gt;createSweptSurface(Oline, pEnt, sweepOptions);
			AcDbSurface *surface = sweptSurface, *pNewSurface=nullptr;

			AcDbDatabase* pDB = acdbHostApplicationServices()-&amp;gt;workingDatabase();

			double len = endDist - startDist;
			int nn = int(len / Space);
			double startlen = (len - nn * Space) * 0.5;

			TempPoint = startPoint;

			AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid2; LsSolid2.create(); // moved outside the for-loop
			AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; LsSolid1; LsSolid1.create(); // moved outside the for-loop

			for (int k = 0; k &amp;lt; nn + 1; k++)
			{
				es = pEnt-&amp;gt;getParamAtDist(startlen + (k * 300), dTmpParam1);
				es = pEnt-&amp;gt;getPointAtParam(dTmpParam1, TempPoint);
				es = pEnt-&amp;gt;getFirstDeriv(dTmpParam1, nDir);
				es = pEnt-&amp;gt;getSecondDeriv(dTmpParam1, mDir);
				lDir = nDir.crossProduct(mDir);
				lDir.normalize();
				mDir = nDir.crossProduct(lDir); // mDir is not always perpendicular to nDir!
				nDir.normalize();
				mDir.normalize();

				AcGeMatrix3d MtransMat, MatFinal;
				MtransMat.setCoordSystem(TempPoint, lDir, mDir * -1, nDir);

				AcGeMatrix3d mat;
				AcGeVector3d vec;

				LsSolid1-&amp;gt;createFrustum(K * 4, 6, 6, 6);
				mat.setToRotation(1.5707963268, AcGeVector3d::kXAxis, AcGePoint3d::kOrigin);
				MatFinal = mat;					// Calculate a final transformation matrix
				vec = AcGeVector3d(L / 2 - 10, 0, 0);
				mat.setToTranslation(vec);
				MatFinal = MtransMat * mat * MatFinal;
				LsSolid1-&amp;gt;transformBy(MatFinal); // and transform once with MatFinal

				LsSolid2-&amp;gt;createFrustum(K * 4, 6, 6, 6);
				mat.setToRotation(1.5707963268, AcGeVector3d::kXAxis, AcGePoint3d::kOrigin);
				MatFinal = mat;					// Calculate a final transformation matrix
				vec = AcGeVector3d(10 - L / 2, 0, 0);
				mat.setToTranslation(vec);
				MatFinal = MtransMat * mat * MatFinal;
				LsSolid2-&amp;gt;transformBy(MatFinal); // and transform once with MatFinal

				es = surface-&amp;gt;booleanSubtract(LsSolid1, pNewSurface);
				if (!es &amp;amp;&amp;amp; pNewSurface) {
					delete surface;
					surface = pNewSurface;
					pNewSurface = nullptr;
				}
				es = surface-&amp;gt;booleanSubtract(LsSolid2, pNewSurface);
				if (!es &amp;amp;&amp;amp; pNewSurface) {
					delete surface;
					surface = pNewSurface;
					pNewSurface = nullptr;
				}
			}

			// Create the solid 
			AcDb3dSolid* pSolid = nullptr;
			bool bBothSides = false;
			es = surface-&amp;gt;thicken(K, bBothSides, pSolid);
			delete surface; surface = nullptr;

			AcDbObjectId OSolidId;
			if (!es)
			{
				pSolid-&amp;gt;setColorIndex(4);
				es = postToDb(pDB, pSolid, OSolidId);
			}
		}
	}
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 15:43:10 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11390851#M2320</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-08-30T15:43:10Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11391212#M2321</link>
      <description>&lt;P&gt;One more thing regarding your code sample:&lt;/P&gt;
&lt;P&gt;I just noticed that you have two identically named object pointers &lt;FONT face="courier new,courier"&gt;OSolid&lt;/FONT&gt;: One outside of the for-loop and one inside:&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; OSolid;
...
AcDbObjectId OSolidId = PostToModelSpace(OSolid); // keep OSolid open here...

for (int k = 0; k &amp;lt; nn+1; k++) {
    ...
    AcDbObjectPointer&amp;lt;AcDb3dSolid&amp;gt; OSolid(OSolidId,AcDb::kForWrite); //...and remove this!
    ...
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It would improve the performance to remove the&amp;nbsp;&lt;FONT face="courier new,courier"&gt;OSolid&lt;/FONT&gt; object inside the loop and make sure that&amp;nbsp;&amp;nbsp;&lt;FONT face="courier new,courier"&gt;PostToModelSpace(OSolid)&lt;/FONT&gt;does&amp;nbsp;&lt;U&gt;not close&lt;/U&gt; &lt;FONT face="courier new,courier"&gt;OSolid&lt;/FONT&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This will simply keep the&amp;nbsp;&lt;FONT face="courier new,courier"&gt;AcDb3dSolid&lt;/FONT&gt;&amp;nbsp;open for write after it is posted to the model space instead of open/close it in each loop.&amp;nbsp;The destructor of the outer&amp;nbsp;&lt;FONT face="courier new,courier"&gt;OSolid&lt;/FONT&gt; will close the &lt;FONT face="courier new,courier"&gt;AcDb3dSolid&lt;/FONT&gt; as soon as it goes out of scope.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 30 Aug 2022 18:50:45 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11391212#M2321</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-08-30T18:50:45Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11391854#M2322</link>
      <description>&lt;P&gt;&amp;nbsp;Thank you very much!&lt;/P&gt;</description>
      <pubDate>Wed, 31 Aug 2022 02:07:02 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11391854#M2322</guid>
      <dc:creator>463017170</dc:creator>
      <dc:date>2022-08-31T02:07:02Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11395481#M2323</link>
      <description>&lt;LI-CODE lang="general"&gt;				LsSolid2-&amp;gt;createFrustum(K * 4, 6, 6, 6);
				mat.setToRotation(1.5707963268, AcGeVector3d::kXAxis, AcGePoint3d::kOrigin);
				MatFinal = mat;					// Calculate a final transformation matrix
				vec = AcGeVector3d(10 - L / 2, 0, 0);
				mat.setToTranslation(vec);
				MatFinal = MtransMat * mat * MatFinal;
				LsSolid2-&amp;gt;transformBy(MatFinal); // and transform once with MatFinal&lt;/LI-CODE&gt;&lt;P&gt;How can this be calculated at one time&lt;/P&gt;</description>
      <pubDate>Thu, 01 Sep 2022 14:49:05 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11395481#M2323</guid>
      <dc:creator>463017170</dc:creator>
      <dc:date>2022-09-01T14:49:05Z</dc:date>
    </item>
    <item>
      <title>Re: &lt; optimize code &gt;Is there any way to speed up the excavation?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11401125#M2324</link>
      <description>&lt;P&gt;What do you mean? The calculation of &lt;FONT face="courier new,courier"&gt;MatFinal&lt;/FONT&gt;?&lt;BR /&gt;This is &lt;A href="https://en.wikipedia.org/wiki/Matrix_multiplication" target="_blank" rel="noopener"&gt;matrix multiplication.&amp;nbsp;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 05 Sep 2022 08:36:08 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/lt-optimize-code-gt-is-there-any-way-to-speed-up-the-excavation/m-p/11401125#M2324</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-09-05T08:36:08Z</dc:date>
    </item>
  </channel>
</rss>

