明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2114|回复: 8

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

[复制链接]
发表于 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)
   )
发表于 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、加载对话框不需要完整的路径,只需将程序放在搜索路径中行了。
 楼主| 发表于 2002-12-22 19:20:00 | 显示全部楼层

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

想请教一下:entsel 返回图元名称和选定点的值,如果用来选择直线,怎么才能得到直线的两端点的坐标值呢?
发表于 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)
)
 楼主| 发表于 2002-12-23 20:15:00 | 显示全部楼层

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

你的程序思路很好,但好像运行时提示错误信息:“错误: no function definition: EUQAL” ,不知什么原因程序不认equal这个函数呢? 还请指点。
发表于 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"。
 楼主| 发表于 2002-12-25 20:11:00 | 显示全部楼层

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

发表于 2002-12-29 21:01:00 | 显示全部楼层

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

AUTOLISP 现在还再用呀?程序大一点不是要累死人啊,救命啊!!!!
如过你有ARX版的那还过的去呀!
发表于 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还是挺好用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 00:30 , Processed in 0.167387 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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