找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1719|回复: 1

[分享] 利用ARX的重定义函数,给Lisp定义根据不同的参数画圆的函数

[复制链接]
发表于 2013-8-15 14:04:33 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Love-Lisp 于 2013-8-15 22:55 编辑

刚学arx不久,拼凑了一个画圆的函数传递给Lisp调用,Lisp可以根据参数的不同,使用不同的方法绘制园:
  1. //3d点转2d点
  2. AcGePoint2d Pt3dTo2d(AcGePoint3d pt)
  3. {
  4.   AcGePoint2d ptTemp(pt.x, pt.y);
  5.   return ptTemp;
  6. }
  7. //对象添加到模型空间
  8. AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
  9. {
  10.   AcDbBlockTable *pBlockTable;
  11.   acdbHostApplicationServices()->workingDatabase()
  12.     ->getBlockTable(pBlockTable, AcDb::kForRead);
  13.   /*acdbHostApplicationServices()->workingDatabase()
  14.     ->getSymbolTable(pBlockTable, AcDb::kForRead);*/
  15.   AcDbBlockTableRecord *pBlockTableRecord;
  16.   pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
  17.   AcDbObjectId entId;
  18.   pBlockTableRecord->appendAcDbEntity(entId, pEnt);
  19.   pBlockTable->close();
  20.   pBlockTableRecord->close();
  21.   pEnt->close();
  22.   return entId;
  23. }
  24. //圆心、所在平面向量、半径创建圆
  25. AcDbObjectId CreateCircle(AcGePoint3d ptCenter,  AcGeVector3d vec, double radius)
  26. {
  27.   AcDbCircle *pCircle = new AcDbCircle(ptCenter, vec, radius);
  28.   // 将实体添加到图形数据库
  29.   AcDbObjectId circleId;
  30.   circleId = PostToModelSpace(pCircle);
  31.   return circleId;
  32. }
  33. // 圆心、半径创建圆
  34. AcDbObjectId CreateCircle(AcGePoint3d ptCenter, double radius)
  35. {
  36.   AcGeVector3d vec(0, 0, 1);
  37.   return CreateCircle(ptCenter, vec, radius);
  38. }

  39. //两点法创建圆
  40. AcDbObjectId CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2)
  41. {
  42.   // 计算圆心和半径
  43.   AcGePoint2d pt = MiddlePoint(pt1, pt2);
  44.   AcGePoint3d ptCenter(pt[X], pt[Y], 0); // 圆心
  45.   double radius = pt1.distanceTo(pt2) / 2;
  46.   // 创建圆
  47.   return CreateCircle(ptCenter, radius);
  48. }
  49. //几何类法三点画圆
  50. AcDbObjectId CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2,  AcGePoint2d pt3)
  51. {
  52.   // 使用几何类
  53.   AcGeCircArc2d geArc(pt1, pt2, pt3);
  54.   AcGePoint3d ptCenter(geArc.center().x, geArc.center().y, 0);
  55.   return CreateCircle(ptCenter, geArc.radius());
  56. }

  57. //定义外部Lisp函数 addcircle
  58. //绘制圆
  59. //圆心、所在平面向量、半径创建圆
  60. // 圆心、半径创建圆
  61. //两点法创建圆
  62. //三点法创建圆
  63. static int ads_addcircle()
  64. {
  65.    struct resbuf *pArgs =acedGetArgs () ;
  66.    if (pArgs == NULL)
  67.    {
  68.      acdbFail(_T("\n缺少参数"));
  69.      return RTERROR;
  70.    }
  71.     AcGePoint3d p0,p1,p2;
  72.   ads_real rad;
  73.   ads_name ent;
  74.   AcDbObjectId CircleId;
  75.   if (!(pArgs->restype == RTPOINT || pArgs->restype == RT3DPOINT))
  76.   {
  77.     acdbFail(_T("\n参数错误"));
  78.     return RTERROR;

  79.   }
  80.   p0 = asPnt3d(pArgs->resval.rpoint) ;
  81.     pArgs = pArgs->rbnext;
  82.     if (pArgs == NULL)
  83.    {
  84.      acdbFail(_T("\n缺少参数"));
  85.      return RTERROR;
  86.    }
  87.   if (pArgs->restype == RTREAL || pArgs->restype == RTLONG || pArgs->restype == RTSHORT)
  88.   {
  89.     switch (pArgs->restype)
  90.     {
  91.     case RTREAL:
  92.       rad = pArgs->resval.rreal;
  93.       break;
  94.     case RTLONG:
  95.       rad = pArgs->resval.rlong;
  96.       break;
  97.     case RTSHORT:
  98.       rad = pArgs->resval.rint;
  99.       break;
  100.     default:
  101.       break;
  102.     }
  103.     if (pArgs->rbnext != NULL)
  104.     {
  105.       acdbFail(_T("\n参数太多"));
  106.       return RTERROR;
  107.     }
  108.     //“圆心、半径”法创建一个圆
  109.     CircleId = CreateCircle(p0, rad);
  110.     acdbGetAdsName(ent,CircleId);
  111.     acedRetName(ent,RTENAME);
  112.         return (RSRSLT) ;
  113.   }
  114.   if (!(pArgs->restype == RTPOINT || pArgs->restype == RT3DPOINT))
  115.   {
  116.     acdbFail(_T("\n参数错误"));
  117.     return RTERROR;

  118.   }
  119.   p1 = asPnt3d(pArgs->resval.rpoint) ;
  120.   pArgs = pArgs->rbnext;
  121.   if (pArgs == NULL)
  122.   {
  123.     // 两点法创建一个圆
  124.        CircleId =  CreateCircle(Pt3dTo2d (p0), Pt3dTo2d (p1));
  125.      acdbGetAdsName(ent,CircleId);
  126.      acedRetName(ent,RTENAME);
  127.      return (RSRSLT) ;
  128.   }
  129.   if (pArgs->restype == RTPOINT || pArgs->restype == RT3DPOINT)
  130.   {
  131.   p2 = asPnt3d(pArgs->resval.rpoint) ;
  132.   if (pArgs->rbnext != NULL)
  133.   {
  134.     acdbFail(_T("\n参数太多"));
  135.     return RTERROR;
  136.   }
  137.   
  138.    // 三点法创建一个圆
  139.    CircleId = CreateCircle(Pt3dTo2d (p0), Pt3dTo2d (p1), Pt3dTo2d (p2));
  140.    acdbGetAdsName(ent,CircleId);
  141.    acedRetName(ent,RTENAME);
  142.    return (RSRSLT) ;

  143.   }
  144.   else if (pArgs->restype == RTREAL || pArgs->restype == RTLONG || pArgs->restype == RTSHORT)
  145.   {
  146.     switch (pArgs->restype)
  147.     {
  148.     case RTREAL:
  149.       rad = pArgs->resval.rreal;
  150.       break;
  151.     case RTLONG:
  152.       rad = pArgs->resval.rlong;
  153.       break;
  154.     case RTSHORT:
  155.       rad = pArgs->resval.rint;
  156.       break;
  157.     default:
  158.       break;
  159.     }
  160.     if (pArgs->rbnext != NULL)
  161.     {
  162.       acdbFail(_T("\n参数太多"));
  163.       return RTERROR;
  164.     }
  165.     //圆心、所在平面向量、半径创建圆
  166.     AcGeVector3d vec(p1[X],p1[Y],p1[Z]);
  167.     vec.normalize();
  168.     CircleId = CreateCircle(p0, vec,rad);
  169.    
  170.     acdbGetAdsName(ent,CircleId);
  171.     acedRetName(ent,RTENAME);
  172.      return (RSRSLT) ;

  173.   }
  174.   else
  175.   {
  176.     acdbFail(_T("\n参数错误"));
  177.     return RTERROR;
  178.   }
  179. }

在lisp中可以使用如下四种方式调用:

  1. ;;lisp测试:
  2. ;;圆心、所在平面向量、半径创建圆
  3. (addcircle (setq cp (getpoint "\n圆心:"))
  4.      '(0 0 1) ;_ 法线
  5.      (getdist cp "\n半径:")
  6. )
  7. ;;圆心、半径创建圆
  8. (addcircle (setq cp (getpoint "\n圆心:")) (getdist cp "\n半径:"))
  9. ;;两点法创建圆
  10. (addcircle (setq p1 (getpoint "\n第一点:")) (getpoint p1 "\n第二点:"))
  11. ;;三点法画圆
  12. (addcircle (setq p1 (getpoint "\n第一点:")) (getpoint p1 "\n第二点:") (getpoint p1 "\n第三点:"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 06:13 , Processed in 0.313443 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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