按顺序等距排列平行直线
static void zffObjectARX_MyCommand17(void)
{
ads_name ss;
AcDbVoidPtrArray ents;
if (acedSSGet(NULL,NULL,NULL,NULL,ss)!=RTNORM)
{
acedAlert(_T("选择实体失败!"));
return;
}
AcGePoint3dArray pts;
long num;
acedSSLength(ss,&num);
if (num<3)
{
acedAlert(_T("无需均分!"));
return;
}
for (int i=0;i<num;i++)
{
AcDbObjectId entId;
AcDbEntity* pEnt=NULL;
ads_name name;
AcGePoint3d pt;
acedSSName(ss,i,name);
acdbGetObjectId(entId,name);
if (acdbOpenObject(pEnt,entId,AcDb::kForWrite)!=Acad::eOk)
{
acedAlert(_T("部分实体打开失败,无法均分!"));
pEnt->close();
return;
}
if (pEnt->isKindOf(AcDbLine::desc()))
{
AcDbLine* pLine=AcDbLine::cast(pEnt);
pLine->getClosestPointTo(AcGePoint3d::kOrigin,pt,Adesk::kTrue);
pts.append(pt);
ents.append(static_cast<void*>(pLine));
}
else
{
pEnt->close();
}
}
acedSSFree(ss);
AcGePoint3d pt1,pt2;
double dist=0,dist1;
long len=pts.length();
for (int i=0;i<len;i++)
{
for (int j=i+1;j<len;j++)
{
dist1=pts[i].distanceTo(pts[j]);
if (dist1>dist)
{
dist=dist1;
pt1=pts[i];
pt2=pts[j];
}
}
}
pts.remove(pt1);
pts.remove(pt2);
int m,n=0;
for (int j=0;j<pts.length();)
{
dist=pt1.distanceTo(pt2);
for (int i=0;i<pts.length();i++)
{
dist1=pts[i].distanceTo(pt1);
if (dist1<dist)
{
dist=dist1;
m=i;
}
}
AcGeVector3d vec=pt1-pts[m]-(pt1-pt2)*(n+1)/(len-1);
AcGeMatrix3d max;
max.setToTranslation(vec);
for (int i=0;i<ents.length();i++)
{
AcDbLine* pLine=static_cast<AcDbLine*>(ents[i]);
AcGePoint3d ptclose;
pLine->getClosestPointTo(pts[m],ptclose,Adesk::kTrue);
if (pts[m].distanceTo(ptclose)<0.001)
{
pLine->transformBy(max);
}
}
pts.remove(pts[m]);
n++;
}
for (int i=0;i<ents.length();i++)
{
AcDbLine* pLine1=static_cast<AcDbLine*>(ents[i]);
pLine1->close();
}
}
更多文章
-
用AcedGrRead()函数实现一拖多
实现代码:#include "StdAfx.h"#include "StdArx.h"#include "..\..\Common\我的类\Arc.h"#include <acedads.h>#include "..\..\Common\Entity\LineUtil.h"#include <geassign.h>#include <dbents.h>#include "..\..\Common\Others\ConvertUtil.h"#in
-
改变多段线区直
代码:#include "StdAfx.h"#include "StdArx.h"#include <dbpl.h>#include "..\..\Common\Others\ConvertUtil.h"#include <geassign.h>#include "..\..\Common\Entity\ArcUtil.h"#include "..\..\Common\Document\DwgDatabaseUtil.h"#include <afxwin.h&
-
获取任意路径Dwg文件内所有块在控件中显示并能选择插入当前模型空间
主对话框CPP内代码:#include "StdAfx.h"#include "resource.h"#include "BlockDialog.h"#include "..\..\Common\我的类\file.h"#include "..\..\Common\Document\DwgDatabaseUtil.h"#include <dbents.h>#include <dbmain.h>#include "..\..\Chapter11
-
多段线动态切割闭合区域
#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"
-
自创实体类从AcDbCurve派生,实现一些类方法并动态绘制
MyCurve.cpp:#include "StdAfx.h"#include "MyCurve.h"#include "actrans.h"#include "aced.h"//-----------------------------------------------------------------------------Adesk::UInt32 CMyCurve::kCurrentVersionNumber =1 ;//----------------------------------------