多段线动态切割闭合区域

#include "StdAfx.h"
#include "StdArx.h"
#include <dbpl.h>
#include "..\..\Common\Others\ConvertUtil.h"
#include "..\..\Common\Document\DwgDatabaseUtil.h"
#include <dbents.h>
#include <dbregion.h>
#include "..\..\Common\Entity\RegionUtil.h"

// This is command ‘INTERSECT1‘
void ZffMyProjectintersect1()
{
// TODO: Implement the command
ads_name polyLinename;
ads_name polyLinename2;
ads_point pnt;
ads_point pnt2;

AcDbPolyline *pPolyline=NULL;
AcDbPolyline *pPoly=NULL;
AcDbRegion *pRegion1=NULL;
AcDbRegion *pRegion2=NULL;
acedEntSel("\n请选择截取多段线!",polyLinename,pnt);
AcDbObjectId polyLineId;
acdbGetObjectId(polyLineId,polyLinename);
AcDbEntity *pEnt=NULL;
AcGePoint3dArray pts,pts2;
acdbOpenObject(pEnt,polyLineId,AcDb::kForWrite);

if (pEnt->isKindOf(AcDbPolyline::desc()))
{
pPolyline=AcDbPolyline::cast(pEnt);
pEnt->close();
}
AcDbVoidPtrArray curves;
int num=pPolyline->numVerts();
for (int i=0;i<num;i++)
{
AcGePoint2d pt;
pPolyline->getPointAt(i,pt);
pts.append(CConvertUtil::ToPoint3d(pt));
}
pPolyline->getSplitCurves(pts,curves);
pPolyline->close();
AcDbObjectIdArray curvesId;
AcDbCurve *pCurve=NULL;
for (i=0;i<curves.length();i++)
{
pCurve=static_cast<AcDbCurve*>(curves[i]);
curvesId.append(CDwgDatabaseUtil::PostToModelSpace(pCurve));
}
pCurve->close();

acedEntSel("\n请选择被截取多段线!",polyLinename2,pnt2);
acdbGetObjectId(polyLineId,polyLinename2);
acdbOpenObject(pEnt,polyLineId,AcDb::kForWrite);
if (pEnt->isKindOf(AcDbPolyline::desc()))
{
pPoly=AcDbPolyline::cast(pEnt);
pEnt->close();
//pPoly->intersectWith(pPolyline,AcDb::kOnBothOperands,pts,0,0);
}
AcDbVoidPtrArray curves2;
num=pPoly->numVerts();
for (i=0;i<num;i++)
{
AcGePoint2d pt2;
pPoly->getPointAt(i,pt2);
pts2.append(CConvertUtil::ToPoint3d(pt2));
}
pPoly->getSplitCurves(pts2,curves2);
pPoly->close();
AcDbObjectIdArray curvesId2;
AcDbCurve *pCurve2=NULL;
for (i=0;i<curves2.length();i++)
{
pCurve2=static_cast<AcDbCurve*>(curves2[i]);
curvesId2.append(CDwgDatabaseUtil::PostToModelSpace(pCurve2));
}
pCurve2->close();
AcDbObjectIdArray regId=CRegionUtil::Add(curvesId);
AcDbObjectIdArray regId2=CRegionUtil::Add(curvesId2);
for (i=0;i<curvesId.length();i++)
{
acdbOpenObject(pCurve,curvesId[i],AcDb::kForWrite);
pCurve->erase();
pCurve->close();
}
for (i=0;i<curvesId2.length();i++)
{
acdbOpenObject(pCurve2,curvesId2[i],AcDb::kForWrite);
pCurve2->erase();
pCurve2->close();
}
acdbOpenObject(pRegion1,regId[0],AcDb::kForWrite);
acdbOpenObject(pRegion2,regId2[0],AcDb::kForWrite);
pRegion1->booleanOper(AcDb::kBoolIntersect,pRegion2);
pRegion1->close();
pRegion2->close();
}

时间: 2024-10-09 20:19:12

多段线动态切割闭合区域的相关文章

Cesium实现文字、点、多段线、多边形的实时绘制

背景知识 点.线.面以及文字的实时绘制是GIS很重要的一个功能,是用户对感兴趣区域标注的业务需要.同时Cesium提供了点.线(多段线).面及文字(label)绘制的接口,绘制方式总共有两种,一种是通过Entity实体的方式,一种是通过Primitives的方式.第一种使用较为简单,是在Primitives基础上进行了封装:第二种则更加贴近WebGL底层,语法更复杂但是绘制效率更高效率.鉴于实时绘制数据量并不大,不需要使用复杂高效的方法,第一种方法完全适用. Cesium通过ScreenSpac

CAD参数绘制多段线(网页版)

多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定位置.详细说明如下: 参数 说明 DOUBLE dX 点的X坐标 DOUBLE dY 点的Y坐标 _DMxDrawX::DrawPathToPolyline 把路径变成一个Polyline. js中实现代码说明: function DrawPolyline() { //Polyline 又称多义线,

Unreal Engine 4 动态切割模型实现

Unreal Engine 4 动态切割模型实现 <合金装备:复仇>里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割. UE4中的ProceduralMeshComponent这个组件可以很容易的就实现这种功能,下面介绍下实现的方法. 准备模型 首先我们准备一个模型. 我做了一个简单的圆柱体,用来测试.注意需要切割的地方,为了保证细节,多放点顶点. 为了能够动态切割,我们要勾选这个模型的Allow CPUAccess选项. 新建蓝图 新建一个Actor蓝图,为它添加两

ObjectARX2010 学习笔记004:复制多段线点生成新多段线

static void swtArxProject5plcopy(void) { // Add your code for command swtArxProject5.plcopy here //定义对象名和点 ads_name ename;ads_point pt; //如果没有选择到实体 if(acedEntSel(NULL,ename,pt)!=RTNORM) { return; } //定义并获取ID AcDbObjectId id; acdbGetObjectId(id,ename)

计算闭合区域面积

/// <summary> /// 计算闭合区域面积 /// </summary> /// <param name="X"></param> /// <param name="Y"></param> /// <param name="numPoints"></param> /// <returns></returns> doub

CAD参数绘制多段线(安卓版)

多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: MxLibDraw.pathMoveTo 把路径的开始位置移动指定的点.详细说明如下: 参数 说明 double dX 点的X坐标 double dY 点的Y坐标 MxLibDraw.pathLineTo 把路径下一个点移到指定位置.详细说明如下: 参数 说明 double dX 点的X坐标 double dY 点的Y坐标 MxLibDraw.drawPathTo

objectarx 多段线自交检查

只支持直线段的多段线检查,因为主要用了初中的知识,一元一次方程求交点,详细的说就是,把多段线上相邻的两个点构成一条直线段,然后每条直线段与剩余的直线段求交点,一条直线段就代表一个一元一次方程,知道两点就知道这个方程是什么样的.求出交点之后得判断这个点是否是多段线上本身的点,判断方法是判断求出来的交点与构成交点的两条直线段的4个点做比较,如果点的误差在1e-4之内,就认为这个交点是在多段线的端点上,不作为要求的交点.除了这种可能之外,所求交点有可能是在直线段的延长线上,通过观察可以知道,如果交点在

4、c++ Arx二次开发创建多段线

一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的使用) 三.具体内容 1.ARX提供了三种多段线相关的类:AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline.PLINE 创建的是AcDbPolyline,3DPOLY创建AcDb3dPolyline.创建一般的轻量多段线只需要调用AcDbPolyline的构造函数

检测车道线——2.选择兴趣区域 Region Masking

通过简单的颜色选择,我们设法消除了图像中除了车道线以外的几乎所有内容.但是,在这一点上,自动提取确切的线条仍然非常棘手,因为我们仍然在周边检测到了一些不是线条线的其他物体. 在这种情况下,我将假定拍摄图像的前置摄像头安装在汽车的固定位置,这样车道线总是会出现在图像的同一区域. 所以在提取行车线的时候,只关注这个梯形区域内的图像,可以避免其他区域的信息造成干扰.这个梯形区域如果选取地太大,则会引入更多无关信息(比如护栏,树木等),如果梯形区域选取太小,则可能看不见行车线,所以这里需要权衡.接下来,