测试结果:

主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次jig操作,就能得到白色的两个相交的polyline,之后需要变成红色的封闭多段线。做法就是:求出两个白色矩形的面域,然后通过bool操作的并集,使得两个面域合并成一个面域。最后就把这个面域在转换成polyline就完成了。其中要注意, 要想在使用向导创建的工程里使用面域的类,需要在头文件:StdAfx.h 中写上这句宏命令#define _BREP_SUPPORT_,就不需要引用库文件了。下面给出详细代码:

拖动矩形的jig操作:

DrawRecJig::DrawRecJig()
{
pl = NULL;
} DrawRecJig::~DrawRecJig()
{
} AcEdJig::DragStatus DrawRecJig::sampler()
{
setUserInputControls((AcEdJig::UserInputControls)( AcEdJig::kAccept3dCoordinates |
AcEdJig::kNoNegativeResponseAccepted |
AcEdJig::kNullResponseAccepted
));
AcGePoint3d ptTemp; AcEdJig::DragStatus status = acquirePoint(ptTemp); if (ptTemp != ptCurrent) { ptCurrent= ptTemp; }
else if (status == DragStatus::kNormal) { return AcEdJig::kNoChange;
}
return status;
} bool DrawRecJig::update()
{
double dist = CConvertUtil::ToPoint2d(ptCenter).distanceTo(CConvertUtil::ToPoint2d(ptCurrent));
// 提取两个角点的坐标值
double x1 = ptCenter.x, x2 = ptCurrent.x;
double y1 = ptCenter.y, y2 = ptCurrent.y; // 计算矩形的角点
AcGePoint2d ptLeftBottom(min(x1, x2), min(y1, y2));
AcGePoint2d ptRightBottom(max(x1, x2), min(y1, y2));
AcGePoint2d ptRightTop(max(x1, x2), max(y1, y2));
AcGePoint2d ptLeftTop(min(x1, x2), max(y1, y2)); pl->setPointAt(, ptLeftBottom);
pl->setPointAt(, ptLeftTop);
pl->setPointAt(, ptRightTop);
pl->setPointAt(, ptRightBottom); return true;
} AcDbEntity * DrawRecJig::entity() const
{
return pl;
} bool DrawRecJig::DoIt(AcGePoint3d & ptCenter, AcDbObjectId &plId)
{ this->ptCenter = ptCenter; pl = new AcDbPolyline(); for (int i = ; i < ; i++)
{
pl->addVertexAt(i, CConvertUtil::ToPoint2d(ptCenter));
}
pl->setClosed(true); setDispPrompt(L"请拖动鼠标:"); if (drag()==kNormal) { //加入到模型空间的封装
plId=CDwgDataBaseUtil::PostToModelSpace(pl); return true;
}
else {
delete pl;
return false; } }

命令类:

static void ECDMyGroupEUnion() {

        DrawRecJig recJig = DrawRecJig();

        ads_point  pt;

        AcDbPolyline *pl1 = NULL, *pl2 = NULL;

        if (acedGetPoint(NULL, L"\n请选择插入点:", pt) == RTNORM) {

            AcDbObjectId  oId1, oId2;

            if (recJig.DoIt(asPnt3d(pt), oId1)) {

                pl1 = AcDbPolyline::cast(recJig.entity());
} if (recJig.DoIt(asPnt3d(pt), oId2)) { pl2 = AcDbPolyline::cast(recJig.entity());
} AcDbVoidPtrArray curveSegments;
AcDbVoidPtrArray regions; curveSegments.append(pl1);
curveSegments.append(pl2); if (AcDbRegion::createFromCurves(curveSegments, regions) == Acad::eOk) { AcDbRegion *region =(AcDbRegion *)regions[]; region->booleanOper(AcDb::BoolOperType::kBoolUnite, (AcDbRegion *)regions[]); AcGePoint3dArray ptArr; CRegionUtil::GetRegionPoints(region, ptArr); for (int i = ; i < regions.length (); i++)
{
AcDbRegion *regionTemp = (AcDbRegion *)regions[i]; regionTemp->erase(); regionTemp->close(); } region->close(); AcDbPolyline *plTemp1 = new AcDbPolyline(); for (int i = ; i <ptArr.length(); i++)
{ plTemp1->addVertexAt(plTemp1->numVerts(), CConvertUtil::ToPoint2d(ptArr.at(i)), , , );
} plTemp1->setClosed(Adesk::kTrue); plTemp1->setColorIndex(); CDwgDataBaseUtil::PostToModelSpace(plTemp1); plTemp1->close(); }
pl1->close();
pl2->close();
}
}

面域转AcGePoint3d:

void CRegionUtil::GetRegionPoints(AcDbRegion* pRegion,AcGePoint3dArray &points)

{
AcBrBrep*pBrep = new AcBrBrep; pBrep->set(*pRegion); AcBrBrepFaceTraverser brFaTrav; for (brFaTrav.setBrep(*pBrep); !brFaTrav.done(); brFaTrav.next()) { AcBrFaceLoopTraverser faLoTrav; AcBrFace face; brFaTrav.getFace(face); for (faLoTrav.setFace(face); !faLoTrav.done(); faLoTrav.next()) { AcBrLoopEdgeTraverser loEdTrav; if (loEdTrav.setLoop(faLoTrav) == AcBr::eOk) { for (; !loEdTrav.done(); loEdTrav.next()) { AcBrEdge edge; loEdTrav.getEdge(edge); AcBrVertex start; edge.getVertex1(start); AcGePoint3d pt; start.getPoint(pt); points.append(pt); } } // else its an isolated loop } } delete pBrep; }

Objectarx 相交矩形求并集 面域转多段线的更多相关文章

  1. Codeforces Round #524 (Div. 2) C. Masha and two friends 几何:判断矩形是否相交以及相交矩形坐标

    题意 :给出一个初始的黑白相间的棋盘  有两个人  第一个人先用白色染一块矩形区域 第二个人再用黑色染一块矩形区域 问最后黑白格子各有多少个 思路:这题的关键在于求相交的矩形区间 给出一个矩形的左下和 ...

  2. HDU_2056——相交矩形的面积

    Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...

  3. PHP求并集,交集,差集

    PHP求并集,交集,差集 一.总结 一句话总结:在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersec ...

  4. JS 对象 数组求并集,交集和差集

    一.JS数组求并集,交集和差集 需求场景 最近,自己项目中有一些数组操作,涉及到一些数学集的运算,趁着完成后总结一下. 简化问题之后,现有两数组a = [1, 2, 3],b = [2, 4, 5], ...

  5. delphi将两个Strlist合并,求并集

    Function StrList_Merge(StrListA,StrListB:String):String; //将两个Strlist合并,求并集 var SListA,SListB,SListC ...

  6. 【C++】Vector判断元素是否存在,去重,求交集,求并集

    1 #include <iostream> 2 #include <vector> 3 #include <algorithm> //sort函数.交并补函数 4 ...

  7. objectarx 按比例分割封闭多段线

    测试结果:这个是按0.1,0.1,0.1,0.3,0.4的比例划分的. 插件描述:这个插件主要是选择一个多段线poly,设置poly的close属性为true,在poly任意一侧画一条长线line(l ...

  8. objectarx 多段线自交检查

    只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点 ...

  9. 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

    一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...

随机推荐

  1. php框架thinkphp3.2.3 配置文件bug

    bug:有前后台的项目部署阶段(DEBUG模式为false)中,修改应用配置文件后,无效,修改自定义配置文件,正常;(开发模式正常) //项目只有后台没有前台的(单独模块),直接写在模块配置中即可,不 ...

  2. 2018-9-2-WPF-开发自动删除软件

    title author date CreateTime categories WPF 开发自动删除软件 lindexi 2018-09-02 14:51:48 +0800 2018-08-09 09 ...

  3. 2018-8-10-win10-uwp-获得缩略图

    title author date CreateTime categories win10 uwp 获得缩略图 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...

  4. sublimeText 3使用教程

    工欲善利其事必先利其器,sublime作为一款轻量.便捷的编译工具,集成了很多插件,功能强大,深受大家的喜爱.掌握好sublime的具体用法,必会为你的工作带来极大的便利!好了,闲话不多说了,下面开始 ...

  5. Cookie的使用、Cookie详解、HTTP cookies 详解、获取cookie的方法、客户端获取Cookie、深入解析cookie

    Cookie是指某些网站为了辨别用户身份.进行session跟踪而存储在用户本地终端上的数据(通常经过加密),比如说有些网站需要登录才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我 ...

  6. Servlet 会话

    在网络的七层模型中,会话层位于传输层之上,它定义如何开始.控制和结束一个会话.七层模式目前仅仅处于理论阶段,但是Web中借鉴了其中的一些思路.在Web中浏览器第一次发送请求到服务器开始直到一方断开为止 ...

  7. Cisco DNA-C POC环境配置

    Step1:在DNA-C上创建Site,本例创建Global->China->WangJiang->20 F如下图: Step2:配置fusion区域的AAA和NTP等信息,如下图: ...

  8. Android6_大致了解4大组件

    一.Activity和View Activity是Android应用中负责与用户交互的组件. View是所有UI控件.容器控件的基类.View组件就是Android应用中用户实实在在看到的部分. Ac ...

  9. Python5_学习方法论

    学习路线: 1.对基础知识的全面掌握,熟悉IDE和基本概念,注重知识体系构建: 2.开发实战.在该过程中掌握各类框架知识.熟悉模块的使用.并根据问题深入学习: ==================== ...

  10. 025.MFC_窗口操作

    窗口操作 一.建立名为dialogOp 的mfc 工程 ,添加9个button 和1个check box组件,并按如图修改caption属性. 最大化窗口 双击最大化button,进入dialogOp ...