创建多段线

1、创建一个工具类CTool。

Tool.h:

static ads_real GetWidth();
static int GetColorIndex();

Tool.cpp

ads_real CTool::GetWidth()
{
	ads_real width = 0;
	if(acedGetReal(_T("\n输入线宽:"), &width)==RTNORM)
	{
		return width;
	}
	else
	{
		return 0;
	}
}

int CTool::GetColorIndex()
{
	int colorIndex = 0;
	if(acedGetInt(_T("输入颜色索引值(0~256):"), &colorIndex) != RTNORM)
	{
		return 0;
	}

	while(colorIndex < 0 || colorIndex >256)
	{
		acedPrompt(_T("输入了错误的颜色索引值!"));
		if(acedGetInt(_T("输入颜色索引值(0~256)"), &colorIndex) != RTNORM)
		{
			return 0;
		}
	}

	return colorIndex;
}

2、添加命令AddPoly

实现代码如下:

static void qxzyAddPolyDynamicCommands_AddPoly(void)
	{
		// Add your code for command qxzyAddPolyDynamicCommands._AddPoly here
		int colorIndex = 0;
		ads_real width = 0;

		int index = 2;
		ads_point ptStart;

		if(acedGetPoint(NULL, _T("\n输入第一点:"), ptStart) != RTNORM)
			return;
		ads_point ptPrevious,ptCurrent;
		acdbPointSet(ptStart, ptPrevious);
		AcDbObjectId polyId;

		acedInitGet(NULL, _T("W C O"));
		int rc = acedGetPoint(ptPrevious,
			_T("\n输入下一点[宽度(W)/颜色(C)]<完成(O)>"), ptCurrent);
		while(rc == RTNORM || rc == RTKWORD)
		{
			if(rc == RTKWORD)
			{
				ACHAR kword[20];
				if(acedGetInput(kword)!=RTNORM)
					return;
				if(strcmp((LPSTR)(LPCTSTR)kword,"W")==0)
				{
					width = CTool::GetWidth();
				}
				else if(strcmp((LPSTR)(LPCTSTR)kword,"C")==0)
				{
					colorIndex = CTool::GetColorIndex();
				}
				else if(strcmp((LPSTR)(LPCTSTR)kword, "O")==0)
				{
					return;
				}
				else
				{
					acutPrintf(_T("\n无效的关键字"));
				}
			}
			else if(rc == RTNORM)
			{
				if(index == 2)
				{
					AcDbPolyline *pPoly= new AcDbPolyline(2);
					AcGePoint2d ptGe1,ptGe2;
					ptGe1[X]=ptPrevious[X];
					ptGe1[Y]=ptPrevious[Y];
					ptGe2[X]=ptCurrent[X];
					ptGe2[Y]=ptCurrent[Y];
					pPoly->addVertexAt(0, ptGe1);
					pPoly->addVertexAt(1, ptGe2);

					pPoly->setConstantWidth(width);
					pPoly->setColorIndex(colorIndex);

					AcDbBlockTable *pBlkTbl;
					acdbHostApplicationServices()->workingDatabase()
						->getSymbolTable(pBlkTbl, AcDb::kForRead);

					AcDbBlockTableRecord *pBlkTblRcd;
					pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite);

					pBlkTblRcd->appendAcDbEntity(polyId, pPoly);

					pBlkTblRcd->close();
					pBlkTbl->close();
					pPoly->close();

				}
				else if(index>2)
				{
					AcDbPolyline *pPoly;
					acdbOpenObject(pPoly, polyId, AcDb::kForWrite);

					AcGePoint2d ptGe;
					ptGe[X]=ptCurrent[X];
					ptGe[Y]=ptCurrent[Y];

					pPoly->addVertexAt(index-1,ptGe);
					pPoly->setConstantWidth(width);
					pPoly->setColorIndex(colorIndex);

					pPoly->close();
				}
				index++;

				acdbPointSet(ptCurrent,ptPrevious);
			}

			acedInitGet(NULL, _T("W C O"));
			rc = acedGetPoint(ptPrevious,
				_T("\n输入下一点[宽度(W)/颜色(C)]<完成(O)>"), ptCurrent);
		}

	}
时间: 2024-10-31 01:23:52

创建多段线的相关文章

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

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

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)

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

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

多段线动态切割闭合区域

#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

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

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

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

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

objectarx 多段线自交检查

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

修改多段线的凸度

static void zffObjectARX_MyCommand5(void) { ads_point pick; ads_name name; if (acedEntSel(NULL,name,pick)!=RTNORM) { return; } AcGePoint3d ptClosest; AcDbObjectId polyId; double param; AcDbPolyline* pPoly=NULL; acdbGetObjectId(polyId,name); acdbOpenO

散线转化成多段线

std::vector<entStruct> vecInfo; AcDbObjectIdArray idarr=CDwgDatabaseUtil::GetAllEntityIds(); int iLen = idarr.length(); for (int i = 0; i < iLen;i++) { entStruct eTemp; AcDbObjectId idTemp = idarr[i]; AcDbEntity *pEnt = NULL; Acad::ErrorStatus es