duanshui83 发表于 2012-10-21 20:45:02

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

http://bbs.mjtd.com/data/attachment/album/201210/21/200056m7y11xn1fjxrftj0.jpg
(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 )
以上代码在运行时,有时会出现错误,不知什么原因,请大家指正!如顶端第三个长圆孔轴线没有按代码运行,不知何故?

duanshui83 发表于 2012-10-21 20:45:46

自己先顶一个再说

cxs259 发表于 2012-10-22 16:16:07

试了,挺不错的,赞一个!

BDYCAD 发表于 2012-10-22 23:30:34

本帖最后由 BDYCAD 于 2012-10-22 23:46 编辑

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


//--------------------------------支持程序--------------------------------------
AcDbBlockTableRecord *GetModelSpace(AcDb::OpenMode Mode){
      AcDbDatabase *pDwg = acdbHostApplicationServices()->workingDatabase();
      AcDbBlockTable *pBlockTable;
      AcDbBlockTableRecord *pModelSpace;
      pDwg->getSymbolTable(pBlockTable, AcDb::kForRead);
      pBlockTable->getAt(ACDB_MODEL_SPACE, pModelSpace, Mode);
      pBlockTable->close();
      return pModelSpace;
}
//凸度计算函数
double GetBulgeOf3Pt(
                                                         const AcGePoint3d &startPt                        //起点
                                                         , const AcGePoint3d &interPt                //中间一点
                                                         , const AcGePoint3d &endPt                        //终点
                                                         )
{
      double dTmp;
      AcGeCircArc3d aa(startPt, interPt, endPt);
      dTmp = (startPt.x - endPt.x) * (interPt.y - endPt.y) - (interPt.x - endPt.x) * (startPt.y - endPt.y);
      //圆弧逆时针方向
      if (dTmp > 0)      {
                return tan((aa.endAng() - aa.startAng()) * 0.25);
      }
      //圆弧顺时针方向
      else if (dTmp < 0)      {
                return -tan((aa.endAng() - aa.startAng()) * 0.25);
      }
      return 0;
}
//--------------------------------支持程序--------------------------------------
static void BDYCAD2012_RF(void)//20110720画足球场
{
      ads_real KuanDu,ChangDu,Rtd,Ltd;
      ads_point p1,p2,p3,p4,p5,Lmp,Rmp,Pt;
      AcGePoint3d Spt,Pt1,Pt2,Pt3,Pt4,Mpt;
      ads_name Ename;
      AcDbObjectId PLineID,CID;
      AcDbBlockTableRecord *pModelSpace;
      if (acedGetDist(NULL,_T("\n请输入宽度:"),&KuanDu)!=RTNORM)return;
      if (acedGetDist(NULL,_T("\n请输入长度:"),&ChangDu)!=RTNORM)return;
      if (acedGetPoint(NULL,_T("\n请输入插入点"),Pt)!=RTNORM)return;
      Spt=asPnt3d(Pt);
      p1=Spt.x-((0.5*ChangDu)-(0.5*KuanDu));
      p1=Spt.y-(0.5*KuanDu);
      p2=Spt.x+(0.5*ChangDu)-(0.5*KuanDu);
      p2=Spt.y-(0.5*KuanDu);

      p3=Spt.x+(0.5*ChangDu)-(0.5*KuanDu);
      p3=Spt.y+(0.5*KuanDu);
      p4=Spt.x-((0.5*ChangDu)-(0.5*KuanDu));
      p4=Spt.y+(0.5*KuanDu);
      p5=Spt.x-((0.3*ChangDu)-(0.5*KuanDu));
      p5=Spt.y-(0.5*KuanDu);
      Lmp=Spt.x-(0.5*ChangDu);
      Lmp=Spt.y;
      Rmp=Spt.x+(0.5*ChangDu);
      Rmp=Spt.y;

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

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

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

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

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

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

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

hubei_yuyu 发表于 2016-5-26 11:06:53

好东西

尘缘一生 发表于 2018-4-29 16:41:09

进行更改,椭圆孔宽度不用输入,改为鼠标拉动即可!
(defun c:slot (/ w ang1 bp1 bp2 p1 p2 p3 p4 cp1 cp2 cp3 cp4 cp5 cp6 tcm1 tcm2)
(setvar "cmdecho" 0)
(graphscr)
(setq bp1 (getpoint "\n输入长圆孔第一个中心点:")
    bp2 (getpoint bp1 "\n输入长圆孔第二个中心点:")
    bp3 (getpoint bp2 "\n拉出长圆孔半个宽度点:")
    ang1 (angle bp1 bp2)
    w (* (distance bp2 bp3) 2)
)
(setq p1 (polar bp1 (+ ang1 (* 0.5 pi)) (/ w 2))
    p2 (polar bp1 (+ ang1 (* 1.5 pi)) (/ w 2))
    p3 (polar bp2 (+ ang1 (* 0.5 pi)) (/ w 2))
    p4 (polar bp2 (+ ang1 (* 1.5 pi)) (/ w 2))
);求得长圆孔四个关键点
(setq cp1 (polar bp1 (+ ang1 (* 0.5 pi)) (/ (* 5 w) 6))
    cp2 (polar bp1 (+ ang1 (* 1.5 pi)) (/ (* 5 w) 6))
    cp3 (polar bp2 (+ ang1 (* 0.5 pi)) (/ (* 5 w) 6))
    cp4 (polar bp2 (+ ang1 (* 1.5 pi)) (/ (* 5 w) 6))
    cp5 (polar bp1 (+ ang1 pi) (/ (* 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 )
)

前生 发表于 2018-5-2 22:49:43

我一般的做法是用entmake生成,相应的线,以及PLINE线。这样的话,层不用考虑

18112600842 发表于 2024-3-2 14:53:17

学习学习
页: [1]
查看完整版本: 画长圆孔源码,请大家检查以下问题,并指正!多谢了!