hlzhong 发表于 2002-12-22 10:04:00

哪位高手帮我看看这个程序,谢谢!

还请各位高手帮忙看看,下面第一部分为DCL文件,第二部分为autolisp文件,希望通过lisp程序驱动对话框文件,实现在AutoCAD屏幕上(任意)拾取两点,并在点击确定按钮后在这两点间画一条直线。 另外想请问:如果想在点击确定按钮后让程序实现绘图命令的功能,有没有必要再做个子函数,在(action_tile "accept" 后调用它呢?
hidedcl:dialog
{label="简单绘图实例";
   :column
   {: text
    {key="message";
   label="单击拾取点可以在屏幕上拾取一点";
   fixed_width=true;
   fixed_height=true;
   alignment=centered;
   }
   :row
   {ok_only;
      :retirement_button
      {label="拾取点";
       key    ="hide";
       mnemonic="H";
       }}}}





(defun c:hidedcl(/ dcl_id what_next cnt pt1 pt2)
   (setq dcl_id (load_dialog "f:\\acad2000\\lisp201\\ts\\hidedcl.dcl"))
   (setq what_next 2)
   (setq cnt 1)
   (while (>= what_next 2)
   (if(null(new_dialog "hidedcl" dcl_id))
       (exit)
   );endif

   (action_tile "accept" "(done_dialog 1)")
   (action_tile "hide" "(done_dialog 4)")
   (setq what_next (start_dialog))
   (cond
       ((= what_next 4)
        (setq pt1 (getpoint "\npick a point"))
        (setq pt1 (getpoint "\npick a point"))
        (command "line" pt1 pt2 "")
        )
       ((= what_next 0)
        (prompt "\nuser cancelled dialog")
        )
       )
   )
(unload_dialog dcl_id)
(princ)
   )

zhynt 发表于 2002-12-22 13:33:00

好办!

(defun c:hidedcl(/ dcl_id what_next cnt )
   (setq dcl_id (load_dialog "hidedcl.dcl"))
   (setq what_next 2)
   (setq cnt 1)
   (while (>= what_next 2)
   (if(null(new_dialog "hidedcl" dcl_id))
       (exit)
   );endif

   (action_tile "accept" "(done_dialog 1)")
   (action_tile "hide" "(done_dialog 4)")
   (setq what_next (start_dialog))
   (cond
       ((= what_next 4)
(setq pt1 (getpoint "\npick a point"))
(setq pt2 (getpoint "\npick a point"))
)
       ((= what_next 0)
(prompt "\nuser cancelled dialog")
)
       )
   )
(command "line" pt1 pt2 "")
(unload_dialog dcl_id)
(princ)
   )

1、将画线命令放在对话框结束后。
2、加载对话框不需要完整的路径,只需将程序放在搜索路径中行了。

hlzhong 发表于 2002-12-22 19:20:00

非常感谢你的指点!还想请教一下:entsel 返回图元名称和选定点的值,如果。。。。。

想请教一下:entsel 返回图元名称和选定点的值,如果用来选择直线,怎么才能得到直线的两端点的坐标值呢?

CAD菜鸟 发表于 2002-12-23 10:03:00

获取直线的端点

给你一个完整的获取直线的端点的程序:
(defun getlinetwopoint(/ ent el p1 p2)
   (setq ent (car (entsel "\n请选取直线:")));;ent 为实体名
   (if ent (progn                  
       (setq el (entget ent))
       (if (euqal (cdr (assoc 0 el)) "LINE")
         (progn
         (setq p1 (cdr (assoc 10 el)))    ;;p1,p2分别为直线的起、终点
         (setq p2 (cdr (assoc 11 el)))   
          )(progn
         (princ "\n选择的不是直线")
       ))
    )(progn
   (princ "\n没有选择到直线。")
   ))
   (princ)
)

hlzhong 发表于 2002-12-23 20:15:00

非常感谢你的指点,你的程序思路很好,但好像运行时提示错误信息:。。。。

你的程序思路很好,但好像运行时提示错误信息:“错误: no function definition: EUQAL” ,不知什么原因程序不认equal这个函数呢? 还请指点。

CAD菜鸟 发表于 2002-12-24 08:57:00

SORRY

不好意思,输入有误,euqal应为equal.很多人喜欢用"="来表示,但我建议你用此命令较好,因为"="要求非常精确,比如(= 1 1)为"T",但有时不需特别精确,如一直线,你用(setq p1 (getpoint))和(setq p2 (getpoint))采用目标捕捉的方式得到同一端点,然后用(= p1 p2)及(equal p1 p2)来比较一下。equal还用一好处是,可以存在误差比较,如l1, l2两长度很接近,可用(equal l1 l2 k)来比较,k为误差值,(equal 1.2345 1.23455 0.0001)为"T",而(= 1.2345 1.23455)为"nil"。

hlzhong 发表于 2002-12-25 20:11:00

呵呵,我也没看清。。 非常感谢!祝新年快乐!~~

surge007 发表于 2002-12-29 21:01:00

有没有高级一点ARX版的啊,AUTOLISP太土了点吧

AUTOLISP 现在还再用呀?程序大一点不是要累死人啊,救命啊!!!!
如过你有ARX版的那还过的去呀!

CAD菜鸟 发表于 2002-12-30 14:32:00

高级一点的。。。

//获取直线的端点
void GetLineStartAndEndPoint()
{
        ads_name ent;
        ads_point p1;
        Acad::ErrorStatus es;

        if(acedEntSel("\n请选择直线:",ent,p1)!=RTNORM)
        {
                return;
        }   

         AcDbObjectId eId;
        eId.setNull();

        es=acdbGetObjectId(eId, ent);
        if(es!=Acad::eOk) return;

        AcDbEntity * pEnt;
          es=acdbOpenObject(pEnt, eId, AcDb::kForRead);
        if(es!=Acad::eOk) return;
       
         AcDbLine *pLine;
         if(pEnt->isKindOf(AcDbLine::desc()))               
        {
                pLine=AcDbLine::cast(pEnt);
                AcGePoint3d pt1,pt2;
                pt1=pLine->startPoint();//直线起点
                pt2=pLine->endPoint(); //直线终点
        }else{
                acutPrintf("\n选择的不是直线");
        }

        pEnt->close();
        return;
}

编程重要的是实现某个目的,至于采用何种手段,是第二位,其实AUTOLISP还是挺好用的。
页: [1]
查看完整版本: 哪位高手帮我看看这个程序,谢谢!