Objectarx 相交矩形求并集 面域转多段线
测试结果:

主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次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 相交矩形求并集 面域转多段线的更多相关文章
- Codeforces Round #524 (Div. 2) C. Masha and two friends 几何:判断矩形是否相交以及相交矩形坐标
题意 :给出一个初始的黑白相间的棋盘 有两个人 第一个人先用白色染一块矩形区域 第二个人再用黑色染一块矩形区域 问最后黑白格子各有多少个 思路:这题的关键在于求相交的矩形区间 给出一个矩形的左下和 ...
- HDU_2056——相交矩形的面积
Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...
- PHP求并集,交集,差集
PHP求并集,交集,差集 一.总结 一句话总结:在php中如果我想要对两个数组进行如并集.交集和差集操作,我们可直接使用php自带的函数来操作如array_merge(),array_intersec ...
- JS 对象 数组求并集,交集和差集
一.JS数组求并集,交集和差集 需求场景 最近,自己项目中有一些数组操作,涉及到一些数学集的运算,趁着完成后总结一下. 简化问题之后,现有两数组a = [1, 2, 3],b = [2, 4, 5], ...
- delphi将两个Strlist合并,求并集
Function StrList_Merge(StrListA,StrListB:String):String; //将两个Strlist合并,求并集 var SListA,SListB,SListC ...
- 【C++】Vector判断元素是否存在,去重,求交集,求并集
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> //sort函数.交并补函数 4 ...
- objectarx 按比例分割封闭多段线
测试结果:这个是按0.1,0.1,0.1,0.3,0.4的比例划分的. 插件描述:这个插件主要是选择一个多段线poly,设置poly的close属性为true,在poly任意一侧画一条长线line(l ...
- objectarx 多段线自交检查
只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点 ...
- 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口
一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...
随机推荐
- HDU 1864 01背包、
这题题意有点坑阿.感觉特别模糊. 我开始有一点没理解清楚.就是报销的话是整张整张支票报销的.也是我傻逼了 没一点常识 还有一点就是说单张支票总额不超过1000,每张支票中单类总额不超过600,我开始以 ...
- 梯度下降优化算法综述与PyTorch实现源码剖析
现代的机器学习系统均利用大量的数据,利用梯度下降算法或者相关的变体进行训练.传统上,最早出现的优化算法是SGD,之后又陆续出现了AdaGrad.RMSprop.ADAM等变体,那么这些算法之间又有哪些 ...
- 洛谷P1809 过河问题 经典贪心问题
作者:zifeiy 标签:贪心 题目链接:https://www.luogu.org/problem/P1809 我们假设第 \(i\) 个人过河的耗时是 \(t[i]\) ,并且 \(t[i]\) ...
- win10 uwp release 因为 Entry Point Not Found 无法启动
本文告诉大家如果在使用 release 编译时,无法启动应用,出现 Entry Point Not Found 如何让应用运行. 程序"[30760] xx.exe"已退出,返回值 ...
- 面试中常考的字符串操作方法大全,包含ES6
原文链接:http://caibaojian.com/js-string.html 一.charAt() 返回在指定位置的字符. var str="abc" console.log ...
- 2018-2-13-git-合并两个仓库
title author date CreateTime categories git 合并两个仓库 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...
- hdp3.1 hive 3.0的使用记录
近来在做项目中的技术调研,使用最新版的hdp3.1,其中使用spark2.3和hive 3.1. 遇到 一些问题,记录如下: 一,使用spark-sql client driver去访问hive创建的 ...
- filter 应用
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...
- char* 、const char*和string之间的转换
1. const char* 和string 转换 (1) const char*转换为 string,直接赋值即可. EX: const char* tmp = "tsinghua ...
- python知识点总结01(不定时更新)
手写一个完整的装饰器模版 # 用于修复被装饰对象的名称空间 from functools import wrape def wrapper(func): @wraps(func) def inner( ...