明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5046|回复: 7

画长圆孔源码,请大家检查以下问题,并指正!多谢了!

[复制链接]
发表于 2012-10-21 20:45 | 显示全部楼层 |阅读模式

(defun dtr (ang0)
(* ang0 (/ pi 180.0))
)
(defun c:slot (/ w ang1 bp1 bp2 p1 p2 p3 p4 cp1 cp2 cp3 cp4 cp5 cp6 tcm1 tcm2)
(setvar "cmdecho" 0)
(graphscr)
(setq w (getdist "\n Enter slot width(输入孔宽度):")) ;定义孔宽度
(setq bp1 (getpoint "\n Enter first basepoint of the slot(输入长圆孔第一个中心点):") ;长圆孔第一个基点
     bp2 (getpoint bp1 "\n Enter second basepoint of the slot(输入长圆孔第二个中心点):") ;长圆孔第二个基点
     ang1 (angle bp1 bp2) ;计算两基点连线的夹角
     )
(setq p1 (polar bp1 (+ ang1 (dtr 90)) (/ w 2))
  p2 (polar bp1 (+ ang1 (dtr 270)) (/ w 2))
  p3 (polar bp2 (+ ang1 (dtr 90)) (/ w 2))
  p4 (polar bp2 (+ ang1 (dtr 270)) (/ w 2))
  );求得长圆孔四个关键点
(setq cp1 (polar bp1 (+ ang1 (dtr 90)) (/ (* 5 w) 6))
  cp2 (polar bp1 (+ ang1 (dtr 270)) (/ (* 5 w) 6))
  cp3 (polar bp2 (+ ang1 (dtr 90)) (/ (* 5 w) 6))
  cp4 (polar bp2 (+ ang1 (dtr 270)) (/ (* 5 w) 6))
  cp5 (polar bp1 (+ ang1 (dtr 180)) (/ (* 5 w) 6))
  cp6 (polar bp2 ang1 (/ (* 5 w) 6))
  );求得长圆孔中心轴线的六个关键点
;;;------检查是否有“PJ”图层,如无则创建,并置为当前图层--------
(setq tcm1 "PJ")
(if
   (= (tblobjname "LAYER" tcm1) nil);没有该图层
   (command "layer" "n" tcm1 "c" "2" tcm1 "");建立图层  
);if
(command "layer" "s" tcm1 "");置为当前图层
;;;------绘制长圆孔------
(command "pline" p2 p4 "a" p3 "l" p1 "a" p2 "");绘制长圆孔
;;;------检查是否有“zx”图层,如无则创建,并置为当前图层--------
(setq tcm2 "ZX")
(if
   (= (tblobjname "LAYER" tcm2) nil);没有该图层
   (command "layer" "n" tcm2 "c" "1" tcm2 "");建立图层  
);if
(command "layer" "s" tcm2 "");置为当前图层
;;;------绘制长圆孔中心线------
(command "line" cp1 cp2 "")
(command "line" cp3 cp4 "")
(command "line" cp5 cp6 "")
(setvar "cmdecho" 1)
(princ "\n It's Done! Please Check it!(绘制完成,请查看!)")
(prin1 )
)
(princ )
(prompt "<<slot>>绘制长圆孔")
(princ )
以上代码在运行时,有时会出现错误,不知什么原因,请大家指正!如顶端第三个长圆孔轴线没有按代码运行,不知何故?
 楼主| 发表于 2012-10-21 20:45 | 显示全部楼层
自己先顶一个再说
发表于 2012-10-22 16:16 | 显示全部楼层
试了,挺不错的,赞一个!
发表于 2012-10-22 23:30 | 显示全部楼层
本帖最后由 BDYCAD 于 2012-10-22 23:46 编辑

        正巧,我也用到这样的功能,只是行业应用不同,要求不同,我也简单贴上ARX代码,大家参考一下,新手也可以学习一下。高就也可指导一下。谢谢。
       对于ARX 写这个功能应该是很简单。所以在止抛砖引玉,有望有空的大侠改写一份ARX程序用JIG动态较果的:)

  1. //--------------------------------支持程序--------------------------------------
  2. AcDbBlockTableRecord *GetModelSpace(AcDb::OpenMode Mode){
  3.         AcDbDatabase *pDwg = acdbHostApplicationServices()->workingDatabase();
  4.         AcDbBlockTable *pBlockTable;
  5.         AcDbBlockTableRecord *pModelSpace;
  6.         pDwg->getSymbolTable(pBlockTable, AcDb::kForRead);
  7.         pBlockTable->getAt(ACDB_MODEL_SPACE, pModelSpace, Mode);
  8.         pBlockTable->close();
  9.         return pModelSpace;
  10. }
  11. //凸度计算函数
  12. double GetBulgeOf3Pt(
  13.                                                            const AcGePoint3d &startPt                        //起点
  14.                                                            , const AcGePoint3d &interPt                //中间一点
  15.                                                            , const AcGePoint3d &endPt                        //终点
  16.                                                            )
  17. {
  18.         double dTmp;
  19.         AcGeCircArc3d aa(startPt, interPt, endPt);
  20.         dTmp = (startPt.x - endPt.x) * (interPt.y - endPt.y) - (interPt.x - endPt.x) * (startPt.y - endPt.y);
  21.         //圆弧逆时针方向
  22.         if (dTmp > 0)        {
  23.                 return tan((aa.endAng() - aa.startAng()) * 0.25);
  24.         }
  25.         //圆弧顺时针方向
  26.         else if (dTmp < 0)        {
  27.                 return -tan((aa.endAng() - aa.startAng()) * 0.25);
  28.         }
  29.         return 0;
  30. }
  31. //--------------------------------支持程序--------------------------------------
  32. static void BDYCAD2012_RF(void)//20110720画足球场
  33. {
  34.         ads_real KuanDu,ChangDu,Rtd,Ltd;
  35.         ads_point p1,p2,p3,p4,p5,Lmp,Rmp,Pt;
  36.         AcGePoint3d Spt,Pt1,Pt2,Pt3,Pt4,Mpt;
  37.         ads_name Ename;
  38.         AcDbObjectId PLineID,CID;
  39.         AcDbBlockTableRecord *pModelSpace;
  40.         if (acedGetDist(NULL,_T("\n请输入宽度:"),&KuanDu)!=RTNORM)return;
  41.         if (acedGetDist(NULL,_T("\n请输入长度:"),&ChangDu)!=RTNORM)return;
  42.         if (acedGetPoint(NULL,_T("\n请输入插入点"),Pt)!=RTNORM)return;
  43.         Spt=asPnt3d(Pt);
  44.         p1[X]=Spt.x-((0.5*ChangDu)-(0.5*KuanDu));
  45.         p1[Y]=Spt.y-(0.5*KuanDu);
  46.         p2[X]=Spt.x+(0.5*ChangDu)-(0.5*KuanDu);
  47.         p2[Y]=Spt.y-(0.5*KuanDu);

  48.         p3[X]=Spt.x+(0.5*ChangDu)-(0.5*KuanDu);
  49.         p3[Y]=Spt.y+(0.5*KuanDu);
  50.         p4[X]=Spt.x-((0.5*ChangDu)-(0.5*KuanDu));
  51.         p4[Y]=Spt.y+(0.5*KuanDu);
  52.         p5[X]=Spt.x-((0.3*ChangDu)-(0.5*KuanDu));
  53.         p5[Y]=Spt.y-(0.5*KuanDu);
  54.         Lmp[X]=Spt.x-(0.5*ChangDu);
  55.         Lmp[Y]=Spt.y;
  56.         Rmp[X]=Spt.x+(0.5*ChangDu);
  57.         Rmp[Y]=Spt.y;

  58.         AcDbPolyline *QKPline=new AcDbPolyline(4);//生成四个点的LWPOLYLINE式多段线开始
  59.         pModelSpace= GetModelSpace(AcDb::kForWrite);
  60.         pModelSpace->appendAcDbEntity(PLineID,QKPline);
  61.         pModelSpace->close();
  62.         QKPline->setLayer(_T("0"));
  63.         AcGePoint2d Pl2pt;

  64.         Pl2pt=asPnt2d(p1);
  65.         QKPline->addVertexAt(0,Pl2pt);

  66.         Pt1=asPnt3d(p2);
  67.         Pt2=asPnt3d(Rmp);
  68.         Pt3=asPnt3d(p3);
  69.         Rtd=GetBulgeOf3Pt(Pt1,Pt2,Pt3);//右边凸度如果RisFillQK=FALSE凸度等于0,这样就是直线,
  70.         Pl2pt=asPnt2d(p2);
  71.         QKPline->addVertexAt(1,Pl2pt,Rtd);//PLINE起点为弧

  72.         Pl2pt=asPnt2d(p3);
  73.         QKPline->addVertexAt(2,Pl2pt);//PLINE起点为弧3

  74.         Pt1=asPnt3d(p4);
  75.         Pt2=asPnt3d(Lmp);
  76.         Pt3=asPnt3d(p1);
  77.         Ltd=GetBulgeOf3Pt(Pt1,Pt2,Pt3);//右边凸度如果RisFillQK=FALSE凸度等于0,这样就是直线,
  78.         Pl2pt=asPnt2d(p4);
  79.         QKPline->addVertexAt(3,Pl2pt,Rtd);//PLINE起点为弧

  80.         Pl2pt=asPnt2d(p1);
  81.         QKPline->addVertexAt(4,Pl2pt);//PLINE起点为弧

  82.         //QKPline->setClosed(TRUE);
  83.         QKPline->close();
  84.         acdbGetAdsName(Ename,PLineID);
  85.         acedCommand(RTSTR,_T("rotate"),RTLB,RTENAME,Ename,RT3DPOINT,p1,RTLE,RTSTR,_T(""),RT3DPOINT,Pt,0);
  86.         return;
  87. }

发表于 2016-5-26 11:06 | 显示全部楼层
好东西
发表于 2018-4-29 16:41 | 显示全部楼层
进行更改,椭圆孔宽度不用输入,改为鼠标拉动即可!
  1. (defun c:slot (/ w ang1 bp1 bp2 p1 p2 p3 p4 cp1 cp2 cp3 cp4 cp5 cp6 tcm1 tcm2)
  2.   (setvar "cmdecho" 0)
  3.   (graphscr)  
  4.   (setq bp1 (getpoint "\n输入长圆孔第一个中心点:")
  5.     bp2 (getpoint bp1 "\n输入长圆孔第二个中心点:")
  6.     bp3 (getpoint bp2 "\n拉出长圆孔半个宽度点:")
  7.     ang1 (angle bp1 bp2)
  8.     w (* (distance bp2 bp3) 2)
  9.   )
  10.   (setq p1 (polar bp1 (+ ang1 (* 0.5 pi)) (/ w 2))
  11.     p2 (polar bp1 (+ ang1 (* 1.5 pi)) (/ w 2))
  12.     p3 (polar bp2 (+ ang1 (* 0.5 pi)) (/ w 2))
  13.     p4 (polar bp2 (+ ang1 (* 1.5 pi)) (/ w 2))
  14.   );求得长圆孔四个关键点
  15.   (setq cp1 (polar bp1 (+ ang1 (* 0.5 pi)) (/ (* 5 w) 6))
  16.     cp2 (polar bp1 (+ ang1 (* 1.5 pi)) (/ (* 5 w) 6))
  17.     cp3 (polar bp2 (+ ang1 (* 0.5 pi)) (/ (* 5 w) 6))
  18.     cp4 (polar bp2 (+ ang1 (* 1.5 pi)) (/ (* 5 w) 6))
  19.     cp5 (polar bp1 (+ ang1 pi) (/ (* 5 w) 6))
  20.     cp6 (polar bp2 ang1 (/ (* 5 w) 6))
  21.   );求得长圆孔中心轴线的六个关键点
  22.   ;;;------检查是否有“PJ”图层,如无则创建,并置为当前图层--------
  23.   (setq tcm1 "PJ")
  24.   (if
  25.     (= (tblobjname "LAYER" tcm1) nil);没有该图层
  26.     (command "layer" "n" tcm1 "c" "2" tcm1 "");建立图层  
  27.   );if
  28.   (command "layer" "s" tcm1 "");置为当前图层
  29.   ;;;------绘制长圆孔------
  30.   (command "pline" p2 p4 "a" p3 "l" p1 "a" p2 "");绘制长圆孔
  31.   ;;;------检查是否有“zx”图层,如无则创建,并置为当前图层--------
  32.   (setq tcm2 "ZX")
  33.   (if
  34.     (= (tblobjname "LAYER" tcm2) nil);没有该图层
  35.     (command "layer" "n" tcm2 "c" "1" tcm2 "");建立图层  
  36.   );if
  37.   (command "layer" "s" tcm2 "");置为当前图层
  38.   ;;;------绘制长圆孔中心线------
  39.   (command "line" cp1 cp2 "")
  40.   (command "line" cp3 cp4 "")
  41.   (command "line" cp5 cp6 "")
  42.   (setvar "cmdecho" 1)
  43.   (princ "\n It's Done! Please Check it!(绘制完成,请查看!)")
  44.   (prin1 )
  45. )

发表于 2018-5-2 22:49 | 显示全部楼层
我一般的做法是用entmake生成,相应的线,以及PLINE线。这样的话,层不用考虑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 09:52 , Processed in 0.422578 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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