void Additional_Class::Get_PolyLine_Point( AcDbObjectId PolyLineId,AcGePoint3dArray &PointArray ) { AcDbEntity *pEnt_Temp = NULL; Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt_Temp, PolyLineId, AcDb::kForRead); if (es != Acad::eOk) { acutPrintf(_T("\nOPEN POLYLINE ERROR")); return; } if (!pEnt_Temp->isKindOf(AcDbPolyline::desc())) { acutPrintf(_T("\nENTITY IS NOT POLYLINE")); return; } AcDbPolyline *pPolyLine = AcDbPolyline::cast(pEnt_Temp); int num = pPolyLine->numVerts(); AcGePoint3d Start_temp_PT,End_temp_PT; for (int index=0; index<num; index++) { if (pPolyLine->segType(index) == AcDbPolyline::kLine) { AcGeLineSeg3d tempLine; pPolyLine->getLineSegAt(index,tempLine); Start_temp_PT = tempLine.startPoint(); End_temp_PT = tempLine.endPoint(); PointArray.append(Start_temp_PT); PointArray.append(End_temp_PT); } else if (pPolyLine->segType(index) == AcDbPolyline::kArc) { AcGeCircArc2d tempArc; pPolyLine->getArcSegAt(index,tempArc); Start_temp_PT.set(tempArc.startPoint().x,tempArc.startPoint().y,0); End_temp_PT.set(tempArc.endPoint().x,tempArc.endPoint().y,0); PointArray.append(Start_temp_PT); PointArray.append(End_temp_PT); } } pEnt_Temp->close(); AcGeIntArray IndexArray; for (int i=1; i<PointArray.length();i++) { if (PointArray[i] == PointArray[i-1]) { IndexArray.append(i); PointArray.remove(PointArray[i]); } } }
void CreateCircleLoop( AcDbHatch* pHatch, const AcGePoint3d& pt, double radius ) { AcGeCircArc2d* cirArc = new AcGeCircArc2d(); cirArc->setCenter( Point3D_To_2D( pt ) ); cirArc->setRadius( radius ); cirArc->setAngles( 0.0, PI * 2 ); AcGeIntArray edgeTypes; AcGeVoidPointerArray edgePtrs; edgeTypes.append( AcDbHatch::kCirArc ); edgePtrs.append( ( void* )cirArc ); pHatch->appendLoop( AcDbHatch::kDefault, edgePtrs, edgeTypes ); }
void CreatePolygonLoop( AcDbHatch* pHatch, const AcGePoint3dArray& pts ) { AcGeIntArray edgeTypes; AcGeVoidPointerArray edgePtrs; int n = pts.length(); for( int i = 0; i < n; i++ ) { AcGePoint2d p1 = Point3D_To_2D( pts[i] ); AcGePoint2d p2 = Point3D_To_2D( pts[( i + 1 ) % n] ); AcGeLineSeg2d* pLine = new AcGeLineSeg2d( p1, p2 ); edgePtrs.append( pLine ); edgeTypes.append( AcDbHatch::kLine ); } pHatch->appendLoop( AcDbHatch::kDefault, edgePtrs, edgeTypes ); }
void asdktest6 () { int nPoints =8 ; int nTriangles =12 ; int nIndices =3 * nTriangles ; double p [] ={ 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1 } ; int i [] ={ 0, 1, 5, 0, 5, 4, 1, 6, 5, 1, 2, 6, 4, 5, 6, 4, 6, 7, 7, 0, 4, 7, 3, 0, 2, 0, 3, 2, 1, 0, 7, 6, 3, 6, 2, 3 } ; AcGeIntArray indices (nIndices) ; indices.setLogicalLength (nIndices) ; indices.setPhysicalLength (nIndices) ; memcpy (indices.asArrayPtr (), i, nIndices * sizeof (int)) ; AcGePoint3dArray gePts (nPoints) ; gePts.setLogicalLength (nPoints) ; gePts.setPhysicalLength (nPoints) ; memcpy (gePts.asArrayPtr (), p, nPoints * sizeof (AcGePoint3d)) ; void *acisBody =createBodyFromTriangles (gePts, indices) ; AcDb3dSolid *b =new AcDb3dSolid ; b->setASMBody(acisBody); AcDbObjectId id ; postToDatabase (NULL, b, id) ; }
Acad::ErrorStatus PDEcone::getgrippoints(AcGePoint3dArray& gripArray) const { assertReadEnabled(); gripArray.append(m_ptStart); gripArray.append(m_ptEnd); AcGePoint3dArray pArray; AcGeIntArray stdIdx; int actPrecision; getVertices(m_dDividPrecision, pArray, stdIdx, actPrecision); int actPrecision__1 = actPrecision + 1; int stdIdxLen_1 = stdIdx.length() - 1; for(int i = 0; i < stdIdxLen_1; i++) { gripArray.append(pArray[stdIdx[i]]); gripArray.append(pArray[stdIdx[i] + actPrecision__1]); } return Acad::eOk; }
AcDbIntArray & geomIds) const #else Acad::ErrorStatus PDEcone::getOsnapPoints( AcDb::OsnapMode osnapMode, int gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const #endif { assertReadEnabled(); if(!hasSnap()) return Acad::eOk; int gsSelectionMark_int = (int)gsSelectionMark; if(gsSelectionMark_int == 0) return Acad::eOk; AcGePoint3dArray pArray; AcGeIntArray stdIdx; int actPrecision; getVertices(m_dDividPrecision, pArray, stdIdx, actPrecision); int actPrecision__1 = actPrecision + 1; int stdIdxLen = stdIdx.length(); int stdIdxLen_1 = stdIdxLen - 1; int stdIdxLen____2 = stdIdxLen / 2; AcGeVector3d viewDir(viewXform(Z, 0), viewXform(Z, 1), viewXform(Z, 2)); AcGeVector3d vect = getFaceVect(); int i; switch(osnapMode) { case AcDb::kOsModeEnd: snapPoints.append(m_ptStart); snapPoints.append(m_ptEnd); for(i = 0; i < stdIdxLen_1; ++i) { snapPoints.append(pArray[stdIdx[i]]); snapPoints.append(pArray[stdIdx[i] + actPrecision__1]); } break; case AcDb::kOsModeMid: snapPoints.append(m_ptStart + (m_ptEnd - m_ptStart) / 2.0); for(i = 0; i < stdIdxLen_1; ++i) snapPoints.append(pArray[stdIdx[i]] + (pArray[stdIdx[i] + actPrecision__1] - pArray[stdIdx[i]]) / 2.0); break; case AcDb::kOsModeCen: if(gsSelectionMark_int == 1) snapPoints.append(m_ptStart); else if(gsSelectionMark_int == 2) snapPoints.append(m_ptEnd); else snapPoints.append(m_ptStart + (m_ptEnd - m_ptStart) / 2.0); break; case AcDb::kOsModeQuad: for(i = 0; i < stdIdxLen____2; i++) { snapPoints.append(pArray[stdIdx[i * 2]]); snapPoints.append(pArray[stdIdx[i * 2] + actPrecision__1]); } break; case AcDb::kOsModeNode: break; case AcDb::kOsModeIns: snapPoints.append(m_ptStart); break; case AcDb::kOsModePerp: { AcGeLine3d line; AcGeVector3d vec; AcGePoint3d pt; if(gsSelectionMark_int == 1) { AcGeCircArc3d cir(m_ptStart, vect, m_dDiameter1 / 2.0); pt = cir.closestPointTo(lastPoint); snapPoints.append(pt); } else if(gsSelectionMark_int == 2) { AcGeCircArc3d cir(m_ptEnd, vect, m_dDiameter2 / 2.0); pt = cir.closestPointTo(lastPoint); snapPoints.append(pt); } //重新定义对象垂直正交点的捕捉方式,同时满足实体模型和线框模型的捕捉 //modified by szw 2009.11.18 : begin else if(gsSelectionMark_int == 3) { for(int i = 0; i < stdIdxLen - 1; ++i) { vec = pArray[stdIdx[i]] - pArray[stdIdx[i] + actPrecision__1]; line.set(pArray[stdIdx[i]], vec); pt = line.closestPointTo(lastPoint); snapPoints.append(pt); } } //modified by szw 2009.11.18 : end } break; case AcDb::kOsModeTan: break; case AcDb::kOsModeNear: { AcGePoint3d pt; AcGeCircArc3d cir; //下底面 if(gsSelectionMark_int == 1) { cir.set(m_ptStart, vect, m_dDiameter1 / 2.0); pt = cir.projClosestPointTo(pickPoint, viewDir); snapPoints.append(pt); } //上底面 else if(gsSelectionMark_int == 2) { cir.set(m_ptEnd, vect, m_dDiameter2 / 2.0); pt = cir.projClosestPointTo(pickPoint, viewDir); snapPoints.append(pt); } //棱边 //重新定义对象垂直正交点的捕捉方式,同时满足实体模型和线框模型的捕捉 //modified by szw 2009.11.18 : begin else if(gsSelectionMark_int == 3) { AcGeLineSeg3d lnsg; AcGePoint3d p1,p2; for(int i = 0; i < stdIdxLen - 1; ++i) { p1 = pArray[stdIdx[i]]; p2 = pArray[stdIdx[i] + actPrecision__1]; lnsg.set(p1, p2); // lnsg.set(pArray[stdIdx[i]], pArray[stdIdx[i] + actPrecision__1]); pt = lnsg.projClosestPointTo(pickPoint, viewDir); snapPoints.append(pt); } } //modified by szw 2009.11.18 : end } break; default: break; } return Acad::eOk; }