天气与日历 切换到窄版

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

OBJECT ARX 绘制常用图形 总结

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    将图形加载显示到CAD===================
    static AcDbObjectId LoadEntity(AcDbEntity* entity){
    AcDbBlockTable* pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);


    AcDbBlockTableRecord* pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);


    AcDbObjectId Id;
    pBlockTableRecord->appendAcDbEntity(Id,entity);


    pBlockTable->close();


    pBlockTableRecord->close();

    entity->close();
    return Id;
    }



    为图形添加标注
    static void AddOrdinate(AcGePoint3d ptStart,AcGePoint3d ptEnd,
    CString text){


    AcDbOrdinateDimension* pDim = new
    AcDbOrdinateDimension(true,ptStart,ptEnd,text);


    LoadEntity(pDim);


    }




    画线====================
    static void TESTlineCmd()
    {
    //acutPrintf(_T("\nHello"));

    ads_point inputStart;
    ads_point inputEnd;


    AcGePoint3d ptStart;
    AcGePoint3d ptEnd;


    用户输入要画的坐标
    if(acedGetPoint(NULL,_T("start point"),inputStart) != RTNORM){
    return;
    }
    ptStart[X] = inputStart[X];
    ptStart[Y] = inputStart[Y];
    ptStart[Z] = inputStart[Z];

    if(acedGetPoint(NULL,_T("end point"),inputEnd) != RTNORM){

    return;
    }
    ptEnd[X] = inputEnd[X];
    ptEnd[Y] = inputEnd[Y];
    ptEnd[Z] = inputEnd[Z];


    AcDbLine* pLine = new AcDbLine(ptStart,ptEnd);
    pLine->setColorIndex(2);
    LoadEntity(pLine);

    AddOrdinate(ptStart,ptEnd,_T("hi"));
    //AfxMessageBox(_T("命令画了一条线"));
    }




    画圆形==========================

    static void TESTcirclecmd(){
    垂直平面法向量
    AcGeVector3d vec(0,0,1);
    圆心
    AcGePoint3d ptCenter(100,100,100);


    AcDbCircle* pCircle = new AcDbCircle(ptCenter,vec,1000);

    LoadEntity(pCircle);
    }


    画圆弧================================


    static void TESTarccmd(){
    AcGeVector3d vec(0,0,1);
    AcGePoint3d ptCenter(500,500,500);
    AcDbArc* pArc = new AcDbArc(ptCenter,vec,700,0,90);
    LoadEntity(pArc);
    }


    画多线段============================


    static void TESTpolycmd(){

    构造多点数组
    AcGePoint2dArray points;

    AcGePoint2d pt1(1000, 1000);
    AcGePoint2d pt2(2000, 1800);
    AcGePoint2d pt3(500, 2000);
    AcGePoint2d pt4(3000, 5000);
    points.append(pt1);
    points.append(pt2);
    points.append(pt3);
    points.append(pt4);


    绘制多点线段
    AcDbPolyline* pl = new AcDbPolyline(points.length());
    for(int i = 0;i < points.length();i ++){

    pl->addVertexAt(i,points.at(i),0,0.5,0.5);
    }


    LoadEntity(pl);
    }

    绘制POLY3d线段====================
    static void TESTpoly3dcmd(){

    构造多点数组
    AcGePoint3dArray points;

    AcGePoint3d pt1(10, 10,10);
    AcGePoint3d pt2(20, 10,20);
    AcGePoint3d pt3(20, 20,30);
    points.append(pt1);
    points.append(pt2);
    points.append(pt3);


    绘制多点线段
    AcDb3dPolyline* pl = new AcDb3dPolyline(AcDb::Poly3dType::k3dSimplePoly,points);


    LoadEntity(pl);
    }


    绘制椭圆=========================
    static void TESTellipsecmd(){
    椭圆焦点
    /* AcGePoint2d p1(400,400);
    AcGePoint2d p2(800,400);*/




    中心点
    AcGePoint3d ptCenter(600,400,0);


    AcGeVector3d vecNormal(0,0,1);
    长轴
    AcGeVector3d majorAxis(1000,0,0);


    通过曲率确定短轴长度
    double ratio = 0.6;


    AcDbEllipse* ae = new AcDbEllipse(/*AcGePoint3d::kOrigin*/ptCenter,vecNormal,majorAxis,
    ratio);
    LoadEntity(ae);


    }




    创建样条曲线================
    static void TESTsplinecmd(){
    AcGePoint3d p1(0,0,0),p2(200,600,0),p3(1200,1600,0),
    p4(2000,2000,0);
    AcGePoint3dArray points;
    points.append(p1);
    points.append(p2);
    points.append(p3);
    points.append(p4);

    AcDbSpline* as = new AcDbSpline(points);
    LoadEntity(as);


    }


    创建面域(把用直线创建的闭合图形,生成一个图形的对象)
    static void TESTregioncmd(){

    ads_name ss;
    提示用户选择对象
    int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);
    AcDbObjectIdArray ids;


    if(rt == RTNORM){

    long len;
    获得对象个数
    acedSSLength(ss,&len);
    for(int i = 0;i < len;i ++){

    先从对象中得到名字
    ads_name ent;
    acedSSName(ss,i,ent);


    再从名字中取出ID
    AcDbObjectId objId;
    acdbGetObjectId(objId,ent);
    ids.append(objId);
    }


    }



    acedSSFree(ss);


    得到objId数组之后,开始画区域


    CreateRegion(ids);
    }


    绘制面域
    static AcDbObjectIdArray  CreateRegion(AcDbObjectIdArray ids){


    AcDbObjectIdArray regionIds;
    AcDbVoidPtrArray curves;
    AcDbVoidPtrArray regions;
    AcDbEntity* pEnt;
    AcDbRegion* pRegion;


    for(int i = 0;i < ids.length();i ++){

    acdbOpenAcDbEntity(pEnt,ids.at(i),AcDb::kForRead);

    if(pEnt->isKindOf(AcDbCurve::desc())){

    curves.append(static_cast<void*>(pEnt));
    }
    }


    Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves,regions);
    if(es == Acad::eOk){

    for(int i = 0;i < regions.length();i ++){

    pRegion = static_cast<AcDbRegion*>(regions[i]);
    pRegion->setDatabaseDefaults();
    AcDbObjectId regionId = LoadEntity(pRegion);
    regionIds.append(regionId);
    }


    CString tipStr ;
    tipStr.Format(_T("\n已成功创建面域:%d个"),regions.length());

    acutPrintf(tipStr);
    }
    else{


    for(int i = 0;i < regions.length();i ++){

    delete (AcRxObject*)regions[i];
    }
    }


    for(int i = 0;i < ids.length();i ++){

    pEnt = static_cast<AcDbEntity*>(curves[i]);
    pEnt->close();
    }


    return regionIds;
    }


    //绘制文字===================
    static void TESTtextcmd(){

    AcGePoint3d ptInsert(0,400,0);

    AcDbMText* pMText = new AcDbMText();

    设置多行文字特性


    pMText->setContents(_T("hello!!"));
    pMText->setLocation(ptInsert);
    pMText->setTextHeight(1000);
    pMText->setWidth(1000);
    pMText->setAttachment(AcDbMText::kBottomLeft);


    LoadEntity(pMText);


    }




    创建填充======================
    static void TESThatchcmd(){

    提示用户选择填充边界
    ads_name ss;
    int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);
    AcDbObjectIdArray objIds;


    if(rt == RTNORM){

    long len;
    acedSSLength(ss,&len);
    for(int i = 0;i < len;i ++){

    ads_name ent;
    acedSSName(ss,i,ent);
    AcDbObjectId objId;
    acdbGetObjectId(objId,ent);
    objIds.append(objId);
    }
    }
    acedSSFree(ss);


    选择完毕,绘制填充


    Acad::ErrorStatus es;
    AcDbHatch* pHatch = new AcDbHatch();


    选择填充平面
    AcGeVector3d normal(0,0,1);
    pHatch->setNormal(normal);
    pHatch->setElevation(0);


    设置关联性
    pHatch->setAssociative(true);

    设置填充图案
    pHatch->setPattern(AcDbHatch::kPreDefined,_T(/*"SOLID"*/"ANSI31"));

    设置填充角度
    pHatch->setPatternAngle(45);
    设置填充边界


    es=pHatch->appendLoop(AcDbHatch::kExternal,objIds);


    显示填充对象


    es=pHatch->evaluateHatch();
    LoadEntity(pHatch);
    }


    交互函数练习==================


    static void TESTinputcmd(){
    CString outStr;
    //acedGetReal
    /*ads_real realNum;
    acedGetReal(_T("输入一个实数"),&realNum);
    outStr.Format(_T("%lf"),realNum);
    acutPrintf(outStr);*/
    //acedGetInt
    /*int iNum;
    acedGetInt(_T("输入一个整数"),&iNum);
    outStr.Format(_T("%d"),iNum);
    acutPrintf(outStr);*/
    //acedGetString
       /*TCHAR str[256];
    acedGetString(0,_T("输入一个字符串"),str);
    acutPrintf(str);*/
    //acedGetKword
    /* TCHAR kw[256];
    acedGetKword(_T("输入一个关键字"),kw);
    acutPrintf(kw);*/
    //acedGetPoint
    /* ads_point pt;
    acedGetPoint(NULL,_T("输入一个点"),pt);
    outStr.Format(_T("x:%f,y:%f"),pt[X],pt[Y]);
    acutPrintf(outStr);*/
    //acedGetCorner(要与ads_point联合使用,完成画矩形)
    /*ads_point ptCorner;
    acedGetCorner(pt,_T("输入对角点"),ptCorner);
    outStr.Format(_T("x:%f,y:%f"),ptCorner[X],ptCorner[Y]);
    acutPrintf(outStr);*/
    //acedGetDist(和ads_point结合使用,实现画线)
    /*ads_real ptReal;
    acedGetDist(pt,_T("输入目标值"),&ptReal);
    outStr.Format(_T("%lf"),ptReal);
    acutPrintf(outStr);*/
    //acedGetAngle(和ads_point结合使用,实现画线)
    /* ads_real agReal;
    acedGetAngle(pt,_T("输入一个角度"),&agReal);
    outStr.Format(_T("%lf"),agReal);
    acutPrintf(outStr);*/




    }







    //获得一层的所有对象,变色===============
    static void TESTgetlayerobjcmd(){



    AcDbLayerTable *pLayerTbl;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(
    pLayerTbl,AcDb::kForRead);


    if(!pLayerTbl->has(_T("测试"))){

    acutPrintf(_T("\n当前图形未包含'测试'图层"));
    pLayerTbl->close();
    return;
    }
    AcDbObjectId layerId;
    pLayerTbl->getAt(_T("测试"),layerId);
    pLayerTbl->close();


    获得当前数据库的块表
    AcDbBlockTable* pBlkTbl;
    acdbHostApplicationServices()->workingDatabase()->getBlockTable(
    pBlkTbl,AcDb::kForRead);
    获得模型空间的块表记录
    AcDbBlockTableRecord* pBlkTblRcd;
    pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,AcDb::kForRead);
    pBlkTbl->close();


    创建块表记录遍历器


    AcDbBlockTableRecordIterator* pIter;
    pBlkTblRcd->newIterator(pIter);
    AcDbEntity* pEnt;
    for(pIter->start();!pIter->done();pIter->step()){

    pIter->getEntity(pEnt,AcDb::kForWrite);
    if(pEnt->layerId() == layerId){


    /*AcDbLine* pLine = AcDbLine::cast(pEnt);
    if(pLine != NULL){*/

    pEnt->setColorIndex(1);
    //}
    }
    pEnt->close();
    }


    delete pIter;
    pBlkTblRcd->close();
    }

     

     

     

     

    OBJECT ARX 绘制常用图形 总结
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-7-1 05:49 , Processed in 0.059564 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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