テスト結果:
主なアイデア:矩形の挿入点としてピックアップポイント、それぞれ、二倍治具はこの時点まで動作は、2個の交差するポリライン白色を得ることができる閉じたポリラインになるために必要次に赤。アプローチは、2つの面が表面領域ドメインにマージするように、2つの白い矩形の表面領域、及びその後組ブール演算子を得ます。最後に、完了したポリライン変換でフィールドに平面を置きます。ヘッダファイルに必要なクラスでプロジェクトを作成するウィザードを使用して、使用する表面領域に順に、に注意を払うべきである:STDAFX.Hは文マクロの#define _BREP_SUPPORT_を書くには、リファレンス・ライブラリ・ファイルを必要としません。詳細コードを以下に示します:
長方形治具ドラッグ操作:
DrawRecJig :: DrawRecJig() { PL = NULL; } DrawRecJig ::〜DrawRecJig() { } AcEdJig :: DragStatus DrawRecJig ::サンプラー() { setUserInputControls((AcEdJig :: UserInputControls)( AcEdJig :: kAccept3dCoordinates | AcEdJig :: kNoNegativeResponseAccepted | AcEdJig :: kNullResponseAccepted ))。 AcGePoint3d ptTemp; AcEdJig :: DragStatusステータス = acquirePoint(ptTemp)。 もし(!ptTemp = ptCurrent){ ptCurrent = ptTemp。 } 他 IF(ステータス== DragStatus :: kNormal){ リターンAcEdJig :: kNoChange; } 戻りステータス; } BOOL DrawRecJig ::更新() { ダブル DIST = CConvertUtil :: ToPoint2d(ptCenter).distanceTo(CConvertUtil :: ToPoint2d(ptCurrent )); // 抽出は、二つの対角点の座標値 ダブル X1 = ptCenter.x、X2 = ; ptCurrent.x ダブル Y1 = ptCenter.y、Y2 = ptCurrent.y; // 矩形のコーナーポイントを計算 AcGePoint2d ptLeftBottom(分(X1、X2)、分(Y1、Y2)); AcGePoint2d ptRightBottom(MAX(X1、X2)、分(Y1、Y2))。 AcGePoint2d ptRightTop(MAX(X1、X2)、MAX(Y1、Y2)); AcGePoint2d ptLeftTop(分(X1、X2)、MAX(Y1、Y2)); PL - > setPointAt(0 、ptLeftBottom)。 PL - > setPointAt(1 、ptLeftTop)。 PL - > setPointAt(2 、ptRightTop)。 PL - > setPointAt(3 、ptRightBottom)。 返す 真; } AcDbEntity * DrawRecJig ::エンティティ()のconst { 戻りPL。 } BOOL DrawRecJig ::ドイト(AcGePoint3d&ptCenter、AcDbObjectId&PLID) { この - > ptCenter = ptCenter。 PL =新しい新しいAcDbPolyline(); のための(INT I = 0 <; I 4、I ++ ) { PL - > addVertexAt(I、CConvertUtil :: ToPoint2d(ptCenter)); } PL - > setClosedの(真の); setDispPrompt(L " ドラッグマウス:" ); IF(ドラッグ()== kNormalが){ // パッケージのモデル空間に加え PLID = CDwgDataBaseUtil :: PostToModelSpace(PL); 戻り trueに; } 他{ 削除PL; リターン はfalse ; } }
コマンドカテゴリ:
静的 ボイドECDMyGroupEUnion(){ DrawRecJig recJig = DrawRecJig()。 ads_point PT; AcDbPolyline * PL1 = NULL、* PL2 = NULL; もし(acedGetPoint(NULL、L " \ N请选择插入点:"、PT)== RTNORM){ AcDbObjectId OID1、oId2。 もし(recJig.DoIt(asPnt3d(PT)、OID1)){ PL1 = AcDbPolyline ::キャスト(recJig.entity())。 } であれば(recJig.DoIt(asPnt3d(PT)、oId2)){ PL2 = AcDbPolyline ::キャスト(recJig.entity())。 } AcDbVoidPtrArray curveSegments; AcDbVoidPtrArray領域; curveSegments.append(PL1)。 curveSegments.append(PL2)。 もし(AcDbRegion :: createFromCurves(curveSegments、領域)== アカデミー:: EOK){ AcDbRegion *領域=(AcDbRegion *)領域[ 0 ]。 領域 - > booleanOper(ACDB :: BoolOperType :: kBoolUnite、(AcDbRegion *)領域[ 1 ])。 AcGePoint3dArray ptArr; CRegionUtil :: GetRegionPoints(領域、ptArr)。 以下のために(int型私は= 0を、I <regions.length(); I ++) { AcDbRegion * regionTemp =(AcDbRegion * )領域[I]。 regionTemp - > 消去(); regionTemp - > 近いです(); } 地域 - > 近いです(); AcDbPolyline * plTemp1 = 新しいAcDbPolyline(); 以下のために(INT iが= 0 ; I <ptArr.length(); I ++ ) { plTemp1 - > addVertexAt(plTemp1-> numVerts()、CConvertUtil :: ToPoint2d(ptArr.at(I))、0、0、0 ); } plTemp1 - > setClosed(Adesk :: kTrue)。 plTemp1 - > setColorIndex(1 )。 CDwgDataBaseUtil :: PostToModelSpace(plTemp1)。 plTemp1 - > 近いです(); } PL1 - > 近いです(); PL2 - > 近いです(); } }
表面ドメイン転送AcGePoint3d:
ボイド CRegionUtil :: GetRegionPoints(AcDbRegion * pRegion、AcGePoint3dArray&点) { AcBrBrep * pBrep = 新しいAcBrBrep。 pBrep - > セット(* pRegion)。 AcBrBrepFaceTraverser brFaTrav; 以下のための(!; brFaTrav.setBrep(* pBrep)brFaTrav.done(); brFaTrav.next()) { AcBrFaceLoopTraverser faLoTrav。 AcBrFace顔。 brFaTrav.getFace(面) 用(faLoTrav.setFace(顔);!faLoTrav.done(); faLoTrav.next()) { AcBrLoopEdgeTraverser loEdTrav。 もし(loEdTrav.setLoop(faLoTrav)== ACBR :: EOK) { ため(;!loEdTrav.done(); loEdTrav.next()) { AcBrEdgeエッジ; loEdTrav.getEdge(エッジ)。 AcBrVertexが開始します。 edge.getVertex1(スタート)。 AcGePoint3d PT; start.getPoint(PT)。 points.append(PT)。 } } // 他の孤立ループ } } 削除pBrep。 }