哪位高手帮我看看这个程序,谢谢!
还请各位高手帮忙看看,下面第一部分为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)
)
好办!
(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、加载对话框不需要完整的路径,只需将程序放在搜索路径中行了。
非常感谢你的指点!还想请教一下:entsel 返回图元名称和选定点的值,如果。。。。。
想请教一下:entsel 返回图元名称和选定点的值,如果用来选择直线,怎么才能得到直线的两端点的坐标值呢?获取直线的端点
给你一个完整的获取直线的端点的程序:(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)
)
非常感谢你的指点,你的程序思路很好,但好像运行时提示错误信息:。。。。
你的程序思路很好,但好像运行时提示错误信息:“错误: no function definition: EUQAL” ,不知什么原因程序不认equal这个函数呢? 还请指点。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"。呵呵,我也没看清。。 非常感谢!祝新年快乐!~~
有没有高级一点ARX版的啊,AUTOLISP太土了点吧
AUTOLISP 现在还再用呀?程序大一点不是要累死人啊,救命啊!!!!如过你有ARX版的那还过的去呀!
高级一点的。。。
//获取直线的端点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]