找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4123|回复: 11

[分享] 用ARX给ACAD增加个重建HATCH边界的命令代码

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-5-5 00:57:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 LoveArx 于 2013-5-5 01:01 编辑

[sell=5]
[pcode=cpp,true]//
// ObjectARX defined commands, created by Bill Zhang [2003-2-20], DevTech, Autodesk

#include "StdAfx.h"
#include "StdArx.h"

/////////////////////////////////////////////////////////////////////////////////////////
//        A utility for regenerating the boundaries of a hatch entity if they are lost.
/////////////////////////////////////////////////////////////////////////////////////////

// append an entity to the current space of AutoCAD database
void addAEntToTheCurrentSpaceAndClose(AcDbEntity* pEnt)
{
        AcDbBlockTableRecord *pBlkRec;
        AcDbObjectId objID;
        acdbOpenObject(pBlkRec, acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
        pBlkRec->appendAcDbEntity (objID, pEnt) ;                        
        pEnt->close();
        pBlkRec->close();
}

//-----------------------------------------------------------------------------
// This is command 'RESTOREHATCHBOUNDARY, by Bill Zhang [2003-2-20], DevTech, Autodesk
void BzhRestoreHatchBoundary()
{
#ifdef OARXWIZDEBUG
        acutPrintf ("\nOARXWIZDEBUG - BzhRestoreHatchBoundary() called.");
#endif // OARXWIZDEBUG

        // TODO: Implement the command
        // create a resbuf which is filled with filter conditions.
  struct resbuf *filter = acutBuildList(RTDXF0, "HATCH", RTNONE);
  ads_name ss;
  // ask users to select hatch entities.
  int res = acedSSGet(NULL, NULL, NULL, filter, ss);
  // release filter resbuf.
  acutRelRb (filter);
  if( res != RTNORM )
  {
          acutPrintf("\nNo hatch entities selected!");
          return;
  }

  long length=0l;
  acedSSLength (ss, &length);
  for(long indexSS=0l; indexSS<length; indexSS++)
  {
        ads_name eName;
        res = acedSSName(ss, indexSS, eName);
    if( res != RTNORM )
                continue;

        AcDbObjectId id;  
        acdbGetObjectId(id, eName );
        AcDbHatch*pHatch=NULL;   
        acdbOpenObject(pHatch, id, AcDb::kForRead );
        if( pHatch == NULL )
        continue;

        // For each loop, draw the boundary.
        int nLoops = pHatch->numLoops();
        for( int i=0;i<nLoops; i++ )
        {
                long loopType;
                if( pHatch->loopTypeAt( i ) & AcDbHatch::kPolyline )
                {         
                        AcGePoint2dArray vertices;
                        AcGeDoubleArray bulges;
                        pHatch->getLoopAt( i, loopType, vertices, bulges );   
                        int nVertices = vertices.length();
                        AcDbPolyline *pPoly = new AcDbPolyline(nVertices);
                        for( int vx=0;vx<nVertices;vx++ )
                        {
                                double bulge = bulges.length() < nVertices ? 0.0: bulges[vx];
                                pPoly->addVertexAt( vx, vertices[vx], bulge );
                        }   
                        // append it to the current space of AutoCAD database
                        pPoly->setColorIndex(1);
                        addAEntToTheCurrentSpaceAndClose(pPoly);
                }      
                else
                {         
                        AcGePoint2dArray vertices;
                        AcGeDoubleArray bulges;
                        AcGeVoidPointerArray edgePtrs;
                        AcGeIntArray edgeTypes;  
                        pHatch->getLoopAt(i, loopType,edgePtrs, edgeTypes );
                        for(int j=0; j<edgePtrs.length(); j++)
                        {
                                switch (edgeTypes[j]){
                                case AcDbHatch::kLine:
                                        {
                                                AcGeLineSeg3d *pGeLine3d = (AcGeLineSeg3d*)edgePtrs[j];
                                                AcGePoint3d geP1, geP2;
                                                geP1 = pGeLine3d->startPoint();
                                                geP2 = pGeLine3d->endPoint();
                                                AcDbLine *pLine = new AcDbLine(geP1, geP2);
                                                pLine->setColorIndex(1);
                                                addAEntToTheCurrentSpaceAndClose(pLine);
                                        }
                                        break;
                                case AcDbHatch::kCirArc:
                                        {
                                                AcGePoint3d geCenter;
                                                double dRadius, dStartAng, dEndAng;
                                                AcGeCircArc3d *pGeArc = (AcGeCircArc3d*)edgePtrs[j];
                                                geCenter = pGeArc->center();
                                                dRadius = pGeArc->radius();
                                                dStartAng = pGeArc->startAng();
                                                dEndAng = pGeArc->endAng();
                                                double dAngDiff;
                                                dAngDiff = fabs( dEndAng - dStartAng - atan(1)*8 );
                                                if( dAngDiff > 1e-5 ) // It's an ARC.
                                                {
                                                        AcDbArc *pArc = new AcDbArc(geCenter, dRadius, dStartAng, dEndAng);
                                                        pArc->setColorIndex(1);
                                                        addAEntToTheCurrentSpaceAndClose(pArc);
                                                }
                                                else        // It's a circle.
                                                {
                                                        AcGeVector3d geNorm = pGeArc->normal();
                                                        AcDbCircle *pCir = new AcDbCircle(geCenter, geNorm, dRadius);
                                                        pCir->setColorIndex(1);
                                                        addAEntToTheCurrentSpaceAndClose(pCir);
                                                }
                                        }
                                        break;
                                case AcDbHatch::kEllArc:
                                        {
                                                AcGePoint3d geCenter;
                                                AcGeVector3d geNorm,dMajorAxis, dMinorAxis;
                                                double dMajorRadius, dMinorRadius;
                                                double dStartAng, dEndAng;
                                                AcGeEllipArc3d *pGeEllip = (AcGeEllipArc3d*)edgePtrs[j];
                                                geCenter = pGeEllip->center();
                                                dStartAng = pGeEllip->startAng();
                                                dEndAng = pGeEllip->endAng();
                                                geNorm = pGeEllip->normal();
                                                dMajorAxis = pGeEllip->majorAxis();
                                                dMinorAxis = pGeEllip->minorAxis();
                                                dMajorRadius = pGeEllip->majorRadius();
                                                dMinorRadius = pGeEllip->minorRadius();
                                                AcDbEllipse *pEllip = new AcDbEllipse();
                                                // Note: radiusRatio = dMinorRadius/dMajorRadius (must be within [0, 1])
                                                pEllip->set(geCenter,geNorm,dMajorAxis*dMajorRadius,dMinorRadius/dMajorRadius);
                                                pEllip->setStartParam(dStartAng);
                                                pEllip->setEndParam(dEndAng);
                                                if( pEllip->isNull() == Adesk::kTrue)
                                                {
                                                        acutPrintf("\nFailed to create an ellipse.");
                                                        break;
                                                }
                                                else
                                                {
                                                        pEllip->setColorIndex(1);
                                                        addAEntToTheCurrentSpaceAndClose(pEllip);
                                                }
                                        }
                                        break;
                                case AcDbHatch::kSpline:
                                        {
                                                Adesk::Boolean bIsFixSpline;
                                                AcGePoint3dArray fitPoints;
                                                AcGeTol fitTol;
                                                Adesk::Boolean bTangentsExist;
                                                AcGeVector3d startTangent, endTangent;
                                                int deg;
                                                AcGeNurbCurve3d  *pGeSpline=(AcGeNurbCurve3d *)edgePtrs[j];
                                                assert(pGeSpline);
                                                deg = pGeSpline->degree();
                                                bIsFixSpline = pGeSpline->getFitData(fitPoints,
                                                                                                                        fitTol,
                                                                                                                        bTangentsExist,
                                                                                                                        startTangent,
                                                                                                                        endTangent);
                                                if( bIsFixSpline == Adesk::kTrue )
                                                {
                                                        AcDbSpline *pSpline=new AcDbSpline();
                                                        pSpline->setFitData(fitPoints,
                                                                                                deg,
                                                                                                fitTol.equalVector(),
                                                                                                startTangent,
                                                                                                endTangent);
                                                        if( pSpline->isNull() == Adesk::kTrue)
                                                        {
                                                                acutPrintf("\nFailed to create a spline.");
                                                                break;
                                                        }
                                                        else
                                                        {
                                                                pSpline->setColorIndex(1);
                                                                addAEntToTheCurrentSpaceAndClose(pSpline);
                                                        }
                                                }
                                                else
                                                {
                                                        Adesk::Boolean rational,closed,periodic;
                                                        AcGePoint3dArray gePoints;
                                                        AcGeDoubleArray geWeights;
                                                        AcGePoint3d gePoint;
                                                        AcGeKnotVector geKnots;        
                                                        AcGeDoubleArray dKnots;

                                                        rational = pGeSpline->isRational();
                                                        closed = pGeSpline->isClosed();
                                                        periodic = Adesk::kFalse;
                                                        for(int k=0; k<pGeSpline->numControlPoints(); k++)
                                                        {
                                                                gePoints.append(pGeSpline->controlPointAt(k));
                                                        }
                                                        for(k=0; k<pGeSpline->numWeights(); k++)
                                                        {
                                                                geWeights.append(pGeSpline->weightAt(k));
                                                        }
                                                        geKnots = pGeSpline->knots();                                                        
                                                        for(k=0; k<geKnots.length(); k++)
                                                        {
                                                                dKnots.append(geKnots[k]);
                                                        }

                                                        AcDbSpline *pSpline=new AcDbSpline(deg,
                                                                                        rational,
                                                                                        closed,
                                                                                        periodic,
                                                                                        gePoints,
                                                                                        dKnots,
                                                                                        geWeights);
                                                        if( pSpline->isNull() == Adesk::kTrue)
                                                        {
                                                                acutPrintf("\nFailed to create a spline.");
                                                                break;
                                                        }
                                                        else
                                                        {
                                                                pSpline->setColorIndex(1);
                                                                addAEntToTheCurrentSpaceAndClose(pSpline);
                                                        }
                                                }
                                        }
                                        break;
                                default:
                                        break;
                                }
                        }
                }
        }
        pHatch->close();
  }

  // free up the selection set
  acedSSFree (ss);
}[/pcode]
[/sell]

评分

参与人数 1D豆 +2 收起 理由
ScmTools + 2 很给力!经验

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-5 22:45:42 | 显示全部楼层
建议LZ将一部分代码贴出来,主要的代码收费
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-8 11:58:13 | 显示全部楼层
怎么修改 Hatchloop各节点的坐标呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-7 10:31:44 | 显示全部楼层
买了  看不懂...  只会一点lisp {:soso_e154:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-4-7 10:43:25 | 显示全部楼层
和 Lisp 那个 HatchB 一样,遍历 Loop ,根据实体类型重建一个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-7 15:31:43 | 显示全部楼层
给了豆但看不懂,白整
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 155个

财富等级: 日进斗金

发表于 2016-2-20 20:32:06 | 显示全部楼层
看看好用不
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

发表于 2016-4-9 11:14:55 | 显示全部楼层
本帖最后由 qq564837358 于 2016-4-9 11:18 编辑

这个代码没有将边界与填充关联起来。自己看英文又比较麻烦。。。求大神解决。而且重新生成的边界也不是连续的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-5-26 11:31:03 | 显示全部楼层
LZ 我测试了 有些圆弧的地方创建的位置偏离了 边界没有闭合
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

 楼主| 发表于 2017-5-26 11:34:41 | 显示全部楼层

把你的代码, 和图截图 传上来,图上标记下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2018-5-3 09:43:28 | 显示全部楼层
谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 333个

财富等级: 日进斗金

发表于 2018-5-3 10:03:34 | 显示全部楼层
厉害厉害,学一学
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-8 11:28 , Processed in 0.246009 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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