天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 52|回复: 0

ObjectARX_多段线(多边形,矩形,圆,圆弧)

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]命令的主要执行

void ZffCHAP2AddPolyline()
{
// 创建仅包含一段直线的多段线
AcGePoint2d ptStart(0, 0), ptEnd(100, 100);
CCreateEnt::CreatePolyline(ptStart, ptEnd, 1);

//创建二维多义线
//设置顶点坐标
AcGePoint3dArray ptArr;
ptArr.setLogicalLength(4);
for(int i = 0; i < 4; i++)
{
ptArr[i].set((double)(i/2),(double)(i%2),0.0);
}
CCreateEnt::Create2dPolyLine(ptArr);

// 创建三维多段线
AcGePoint3d pt1(0, 0, 0), pt2(100, 0, 0), pt3(100, 100, 0);
AcGePoint3dArray points;
points.append(pt1);
points.append(pt2);
points.append(pt3);
CCreateEnt::Create3dPolyline(points);

// 创建正多边形
CCreateEnt::CreatePolygon(AcGePoint2d::kOrigin, 6, 30, 0, 1);

// 创建矩形
AcGePoint2d pt(60, 70);
CCreateEnt::CreateRectangle(pt, ptEnd, 1);

// 创建圆
pt.set(50, 50);
CCreateEnt::CreatePolyCircle(pt, 30, 1);

// 创建圆弧
CCreateEnt::CreatePolyArc(pt, 50, CCalculation::GtoR(45),
CCalculation::GtoR(225), 1);
}
封装的一些函数

// 弧度转化为角度
double CCalculation::RtoG(double angle)
{
     return angle * 180 / CCalculation::PI();
}
// 角度转化为弧度
double CCalculation::GtoR(double angle)
{
     return angle * CCalculation::PI() / 180;
}
double CCalculation::Max(double a, double b)
{
     if (a > b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
double CCalculation::Min(double a, double b)
{
    if (a < b)
    {
       return a;
    }
    else
    {
       return b;
    }
}
//旋转
Acad::ErrorStatus CModifyEnt::Rotate(AcDbObjectId entId,
AcGePoint2d ptBase, double
rotation)
{
AcGeMatrix3d xform;
AcGeVector3d vec(0, 0, 1);
xform.setToRotation(rotation, vec, CCalculation::Pt2dTo3d(ptBase));
AcDbEntity *pEnt;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,false);
pEnt->transformBy(xform);
pEnt->close();
return es;
}
//移动
Acad::ErrorStatus CModifyEnt::Move(AcDbObjectId entId, AcGePoint3d ptBase,
AcGePoint3d ptDest)
{
// 设置变换矩阵的参数
AcGeMatrix3d xform;
AcGeVector3d vec(ptDest.x - ptBase.x, ptDest.y - ptBase.y,ptDest.z - ptBase.z);
xform.setToTranslation(vec);
AcDbEntity *pEnt;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,false);
pEnt->transformBy(xform);
pEnt->close();
return es;
}
//缩放
Acad::ErrorStatus CModifyEnt::Scale(AcDbObjectId entId,
AcGePoint3d ptBase, double scaleFactor)
{
// 设置变换矩阵的参数
AcGeMatrix3d xform;
xform.setToScaling(scaleFactor, ptBase);
AcDbEntity *pEnt;
Acad::ErrorStatus es = acdbOpenObject(pEnt, entId, AcDb::kForWrite,false);
pEnt->transformBy(xform);
pEnt->close();
return es;
}
多段线:

AcDbObjectId CCreateEnt::CreatePolyline(AcGePoint2d ptStart,
AcGePoint2d ptEnd, double width)
{
AcGePoint2dArray points;
points.append(ptStart);
points.append(ptEnd);
return CCreateEnt::CreatePolyline(points, width);
}

AcDbObjectId CCreateEnt::CreatePolyline(AcGePoint2dArray points, double width)
{
int numVertices = points.length();
AcDbPolyline *pPoly = new AcDbPolyline(numVertices);
for (int i = 0; i < numVertices; i++)
{
pPoly->addVertexAt(i, points.at(i), 0, width, width);
}
AcDbObjectId polyId;
polyId = CCreateEnt::PostToModelSpace(pPoly);
return polyId;
}

//得到多段线顶点的坐标
void GetPolyLineSelectLineIndex(AcDbPolyline *Poly,AcGePoint3d SelectPt,int Index)
{
AcGePoint2d tempPt(SelectPt.x,SelectPt.y);
double Distance=0.0;  
AcDbVoidPtrArray entitySet;
Poly->explode(entitySet); //将曲线分解成单独的分量。
for(int i=0;i<entitySet.length(); ++i)
{
    AcDbEntity *pEnt = AcDbPolyline::cast((AcRxObject*)entitySet[i]);
    if(pEnt->isA()==AcDbLine::desc())
    {
        AcDbLine *pLine=AcDbLine::cast(pEnt);
        AcGePoint2d StPt,EndPt;
        StPt.x=pLine->startPoint().x;
        StPt.y=pLine->startPoint().y;
        EndPt.x=pLine->endPoint().x;
        EndPt.y=pLine->endPoint().y;
        pLine->close();
        AcGeLine2d GeLine(StPt,EndPt);
        double pama=0;
        if((GeLine.isOn(tempPt,pama)==Adesk::kTrue)&&pama<=1&&pama>=0)
        {
           Index=i;
           break;
        }
        else
        {
            if(GeLine.distanceTo(tempPt)
            {
                AcGeLine2d tempLine;
                GeLine.getPerpLine(tempPt,tempLine);
                AcGePoint2d InsertPt;
                GeLine.intersectWith(tempLine,InsertPt);
                double pama=0.0;
                if((GeLine.isOn(InsertPt,pama)==Adesk::kTrue)&&pama<=1&&pama>=0)
                {
                    Distance=GeLine.distanceTo(tempPt);
                    Index=i;
                }
            }
         }
     }
     pEnt->close();
}
二维多义线:

AcDbObjectId CCreateEnt::Creat2dPolyLine(AcGePoint3dArray ptArr)
{
AcDb2dPolyLine * pPoly2d = new AcDb2dPolyLine(AcDb::k2dSimplePoly,ptArr,0.0,Adesk::kTrue);
return CCreateEnt::PostToModelSpace(pPoly2d );
}
三维多段线:

AcDbObjectId CCreateEnt::Create3dPolyline(AcGePoint3dArray points)
{
AcDb3dPolyline *pPoly3d = new
AcDb3dPolyline(AcDb::k3dSimplePoly, points);
return CCreateEnt::PostToModelSpace(pPoly3d);
}
正多边形:

AcDbObjectId CCreateEnt::CreatePolygon(AcGePoint2d ptCenter, int number,
double radius, double rotation, double width)
{
AcGePoint2dArray points;
double angle = 2 * CCalculation::PI() / (double)number;
for (int i = 0; i < number; i++)
{
AcGePoint2d pt;
pt.x = ptCenter.x + radius * cos(i * angle);
pt.y = ptCenter.y + radius * sin(i * angle);
points.append(pt);
}

AcDbObjectId polyId = CCreateEnt::CreatePolyline(points, width);

// 将其闭合
AcDbEntity *pEnt;
acdbOpenAcDbEntity(pEnt, polyId, AcDb::kForWrite);
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
if (pPoly != NULL)
{
pPoly->setClosed(Adesk::kTrue);
}

pEnt->close();
CModifyEnt::Rotate(polyId, ptCenter, rotation);
return polyId;
}
矩形:

AcDbObjectId CCreateEnt::CreateRectangle(AcGePoint2d pt1, AcGePoint2d pt2,
double width)
{
// 提取两个角点的坐标值
double x1 = pt1.x, x2 = pt2.x;
double y1 = pt1.y, y2 = pt2.y;

// 计算矩形的角点
AcGePoint2d ptLeftBottom(CCalculation::Min(x1, x2),
CCalculation::Min(y1, y2));
AcGePoint2d ptRightBottom(CCalculation::Max(x1, x2),
CCalculation::Min(y1, y2));
AcGePoint2d ptRightTop(CCalculation::Max(x1, x2),
CCalculation::Max(y1, y2));
AcGePoint2d ptLeftTop(CCalculation::Min(x1, x2),
CCalculation::Max(y1, y2));

// 创建对应的多段线
AcDbPolyline *pPoly = new AcDbPolyline(4);
pPoly->addVertexAt(0, ptLeftBottom, 0, width, width);
pPoly->addVertexAt(1, ptRightBottom, 0, width, width);
pPoly->addVertexAt(2, ptRightTop, 0, width, width);
pPoly->addVertexAt(3, ptLeftTop, 0, width, width);
pPoly->setClosed(Adesk::kTrue);

// 将多段线添加到模型空间
AcDbObjectId polyId;
polyId = CCreateEnt::PostToModelSpace(pPoly);
return polyId;
}
圆:

AcDbObjectId CCreateEnt::CreatePolyCircle(AcGePoint2d ptCenter,
double radius, double width)
{
// 计算顶点的位置
AcGePoint2d pt1, pt2, pt3;
pt1.x = ptCenter.x + radius;
pt1.y = ptCenter.y;
pt2.x = ptCenter.x - radius;
pt2.y = ptCenter.y;
pt3.x = ptCenter.x + radius;
pt3.y = ptCenter.y;

// 创建多段线
AcDbPolyline *pPoly = new AcDbPolyline(3);
pPoly->addVertexAt(0, pt1, 1, width, width);
pPoly->addVertexAt(1, pt2, 1, width, width);
pPoly->addVertexAt(2, pt3, 1, width, width);
pPoly->setClosed(Adesk::kTrue);

// 将多段线添加到模型空间
AcDbObjectId polyId;
polyId = CCreateEnt::PostToModelSpace(pPoly);
return polyId;
}
圆弧:

AcDbObjectId CCreateEnt::CreatePolyArc(AcGePoint2d ptCenter, double radius,
double angleStart, double angleEnd, double width)
{
// 计算顶点的位置
AcGePoint2d pt1, pt2;
pt1.x = ptCenter.x + radius * cos(angleStart);
pt1.y = ptCenter.y + radius * sin(angleStart);
pt2.x = ptCenter.x + radius * cos(angleEnd);
pt2.y = ptCenter.y + radius * sin(angleEnd);

// 创建多段线
AcDbPolyline *pPoly = new AcDbPolyline(3);
pPoly->addVertexAt(0, pt1, tan((angleEnd - angleStart) / 4), width,width);
pPoly->addVertexAt(1, pt2, 0, width, width);

// 将多段线添加到模型空间
AcDbObjectId polyId;
polyId = CCreateEnt::PostToModelSpace(pPoly);
return polyId;
}[/code]

 

 

 

 

ObjectARX_多段线(多边形,矩形,圆,圆弧)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 15:34 , Processed in 0.154885 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表