测试结果:

主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次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. Python--day25--接口类

    接口类,起规范作用

  2. Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

    遇到问题 在服务器上运行 nexus 出现Native memory allocation (mmap) failed to map 838860800 bytes for committing re ...

  3. java List接口

    Collection子接口: List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加 ...

  4. [转]Android自定义控件:进度条的四种实现方式(Progress Wheel的解析)

    最近一直在学习自定义控件,搜了许多大牛们Blog里分享的小教程,也上GitHub找了一些类似的控件进行学习.发现读起来都不太好懂,就想写这么一篇东西作为学习笔记吧. 一.控件介绍: 进度条在App中非 ...

  5. linux设备驱动文件结构

    struct file, 定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 注意 file 与用户空间程序的 FILE 指针没有任何关系. 一个 FILE 定义在 ...

  6. Java8 API学习2 - java.lang.CharSequence, java.lang.String

    CharSequence public interface CharSequence 字符序列接口, 实现此接口的非抽象类有String, StringBuffer, StringBuilder. 从 ...

  7. LOGO的浮空显示-Verilog

    为了方便生成准确的mif数据,以实现特定的透明效果.使用Photoshop将网上下载的Logo修改颜色,保存大小为120*120像素,如图1所示. 图1 ps修改后的Logo 使用Pic2mif软件, ...

  8. Linux内核接口特定的类型

    内核中一些通常使用的数据类型有它们自己的 typedef 语句, 因此阻止了任何移植性问 题. 例如, 一个进程标识符 ( pid ) 常常是 pid_t 而不是 int. 使用 pid_t 屏蔽了任 ...

  9. vue-learning:30 - component - 组件实例的引用方式

    组件实例的引用方式 ref / $refs $root $parent $children 扩展查找任意组件实例的方法 在vue开发的项目中,通常会以一棵嵌套的组件树的形式来组织项目. 都存在着一个根 ...

  10. vue+element-ui实现分页

    我使用得是el-table+el-pagination来实现的, 话不多说,直接上代码 html代码部分 <!-- table --> <el-table :data="s ...