1、将配合直角+偶数边功能使用。
2、代码
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
//-----------------------------------------------------------------------------
#define szRDS _RXST("AA")
const double PI = 301415926;
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxProject_App : public AcRxArxApp {
public:
CArxProject_App () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
static void AAMyGroupZZ () {
// Put your command code here
std::vector<AcGePoint2d> pt;
int num = 0;
GetPolylineCoordinates(pt, num);
if (num == 0)
{
return;
}
pt.push_back(pt[0]); num++;
std::vector<AcGePoint2d> positionC;//计算文字插入点位置
std::vector<double> angle;//计算文字插入点位置
std::vector<CString> dis;//计算文字内容--边长
BiaoJi(dis, positionC, angle, pt, num);
setWenzi(dis, positionC, angle);
}
static void BiaoJi(std::vector<CString> &dis,
std::vector<AcGePoint2d> &positionC, std::vector<double> &angle,
std::vector<AcGePoint2d> pt,int num)
{
//有向面积法,正-逆时针,负-顺时针
double A = 0;
for (int i = 0; i < num - 1; i++)
{
A += pt[i].x * pt[i + 1].y - pt[i + 1].x * pt[i].y;
}
for (int i = 0; i < num - 1; i++)
{
//获取每条边的极角值(弧度值)
double angle1;
double pi = 4 * atan(1);
angle1 = atan2(pt[i + 1].y - pt[i].y, pt[i + 1].x - pt[i].x);
if (angle1 < 0)
{
angle1 += 2 * pi;
}
int bb = 0, cc = 0, dd = 0;
if (angle1 > pi / 2 && angle1 <= 1.5 * pi)
{
bb = 1;
}
if (angle1 > 2 * pi)
{
cc = 1;
}
if (cc == 1 || bb == 1)
{
dd = 1;
}
//处理文字方向
while (dd == 1)
{
if (angle1 > pi / 2 && angle1 <= 1.5 * pi)
{
angle1 += pi;
bb = 1;
}
else
{
bb = 0;
}
if (angle1 > 2 * pi)
{
angle1 -= 2 * pi;
cc = 1;
}
else
{
cc = 0;
}
if (bb == 1 || cc == 1)
{
dd = 1;
}
else
{
dd = 0;
}
}
angle.push_back(angle1);
//计算距离值
double d = pt[i].distanceTo(pt[i + 1]);
CString a;
a.Format(_T("%.2f"), d);
dis.push_back(a);
//计算插入点位置
double x1, y1;
x1 = pt[i].x + pt[i + 1].x;
y1 = pt[i].y + pt[i + 1].y;
AcGeVector2d v = pt[i + 1] - pt[i];
AcGeVector2d v2 = v.normalize();
x1 /= 2;
y1 /= 2;
AcGePoint2d pc(x1, y1);//线段中点坐标
AcGePoint2d pz = pc + v2 * 0.5;//距离中点0.5米沿线段方向的坐标
AcGePoint2d pE;
if (A > 0)
{
//逆时针旋转90度
AcGeVector2d vc1 = pz - pc;
AcGeVector2d vc12(-vc1.y, vc1.x);
pE = pc + vc12;
}
if (A < 0)
{
//顺时针旋转90度
AcGeVector2d vc1 = pz - pc;
AcGeVector2d vc12(vc1.y, -vc1.x);
pE = pc + vc12;
}
positionC.push_back(pE);
}
}
static void setWenzi(std::vector<CString> s, std::vector<AcGePoint2d> position, std::vector<double> rotation)
{
//获取文字样式表
AcDbTextStyleTable* pTextStyleTab;
acdbHostApplicationServices()->workingDatabase()
->getTextStyleTable(pTextStyleTab, AcDb::kForWrite);
//simsun.ttc(宋体的字体文件名称)
AcDbTextStyleTableRecord* pTextStyleTabRcd;
pTextStyleTabRcd = new AcDbTextStyleTableRecord();
//获取宋体字样
pTextStyleTab->getAt(_T("宋体"), pTextStyleTabRcd, AcDb::kForRead);
//设置新的字体名称并关联字体文件(需放在CAD字体文件夹目录下)
//pTextStyleTabRcd->setName(_T("宋体 常规"));//字体显示名称
//pTextStyleTabRcd->setFileName(_T("simsun.ttc"));//字体文件名称,打开控制面板,打开字体文件夹,右键字体属性查看
//添加到样式表
pTextStyleTab->add(pTextStyleTabRcd);
//获取对象ID
AcDbObjectId styleId = pTextStyleTabRcd->objectId();
//释放指针,不然实体无法删除等操作
pTextStyleTabRcd->close();
pTextStyleTab->close();
//添加到块表中
AcDbBlockTable* pBT;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
AcDbBlockTableRecord* pBTR;
pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
size_t cc = s.size();
for (int i = 0; i < cc; i++)
{
AcDbText* ptr = new AcDbText();
CString str=s[i];
double height = 0.5;
AcGePoint3d position1(position[i].x, position[i].y, 0);
double rotation1 = rotation[i];
ptr->setTextString(str);
ptr->setHeight(height);
ptr->setRotation(rotation1);
//关联宋体样式
ptr->setTextStyle(styleId);
//对正模式设置--正中
ptr->setHorizontalMode(AcDb::kTextMid);
ptr->setVerticalMode(AcDb::kTextVertMid);
ptr->setAlignmentPoint(position1);//设置对正模式时,需使用此函数插入点,setpositin()函数无效
pBTR->appendAcDbEntity(ptr);
ptr->close();
}
pBT->close();
pBTR->close();
}
static void GetPolylineCoordinates(std::vector<AcGePoint2d>& pA, int& num)
{
ads_name ss;
resbuf rb;
rb.restype = 0;
rb.resval.rstring = _T("LWPOLYLINE");
rb.rbnext = NULL;
int rt = acedSSGet(_T("-b:S"), NULL, NULL, &rb, ss);
if (rt == RTNORM)
{
acutPrintf(TEXT("已选1个\n"));
ads_name entres;
acedSSName(ss, 0, entres);
AcDbObjectId ssId;
acdbGetObjectId(ssId, entres);
AcDbEntity* pEnt;
acdbOpenObject(pEnt, ssId, AcDb::kForRead);
if (pEnt->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline* pPolyline;
pPolyline = AcDbPolyline::cast(pEnt);
num = pPolyline->numVerts();
//acutPrintf(TEXT("num:%d\n"), num);
for (int j = 0; j < num; j++)
{
AcGePoint2d pt;
if (pPolyline->getPointAt(j, pt) == eOk)
{
pA.push_back(pt);
}
}
pPolyline->close();
}
pEnt->close();
acedSSFree(entres);
}
else if (rt == RTCAN)
{
acutPrintf(TEXT("取消\n"));
}
else if (rt == RTREJ)
{
acutPrintf(TEXT("输入无效\n"));
}
else
{
acutPrintf(TEXT("输入失效2\n"));
}
acedSSFree(ss);
}
// Modal Command with pickfirst selection
// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
static void AAMyGroupMyPickFirst () {
ads_name result ;
int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
if ( iRet == RTNORM )
{
// There are selected entities
// Put your command using pickfirst set code here
}
else
{
// There are no selected entities
// Put your command code here
}
}
// Application Session Command with localized name
// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
static void AAMyGroupMySessionCmd () {
// Put your command code here
}
static int ads_MyLispFunction () {
//struct resbuf *args =acedGetArgs () ;
// Put your command code here
//acutRelRb (args) ;
// Return a value to the AutoCAD Lisp Interpreter
// acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal
return (RTNORM) ;
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CArxProject_App)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, ZZ, ZZ, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject_App, AAMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CArxProject_App, MyLispFunction, false)
374

被折叠的 条评论
为什么被折叠?



