怎样写成函数形式?
<P>记得meflying说过一下,当时不明白,现在都不明白。</P><P>现在我想让ET工具中查询视口比例的程序,将其结果传出来给我的程序用,因为我肯定写不出这么完善的程序。</P>
<P>比例一般是1:X或Y:1两种形式,如果是(X Y)形式表达,当X值为0,我就知道是取Y值。</P>
<P>不知说清楚没有?</P> 相当难懂~~~ 这样的内容只能只有小飞才能看懂。 <P>老大,我想改写ET中的查询视口比例程序,变成子程序一样,随自己调用,(粗糙度标注程序,在不同比例的视口中,自动取比例值。)。</P>
<P>我记得以前飞版主说过:函数不会调用? </P>
<P></P>
<P>你都知道ssget函数是这样调用:<U>(setq endata (entget (car _types ))),,,</U></P>
<P><U>为何把SSGET换成我定义的函数就不会用了?</U></P>
<P><A href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=19222" target="_blank" >http://bbs.mjtd.com/forum.php?mod=viewthread&tid=19222</A></P>
<P>如果写成函数形式,(我现在还没明白,怎么写法),就比子程序好用,我是这样想。</P>
<P>(点解打字甘难噶!唔知清楚点没)</P>
<P> </P>
<P> </P>
<P> </P> <P>这是2000年明经杂志的文章内容,供参考:</P>
<P><FONT color=#800000>在布局中的视图称为视口viewport。</FONT> </P>
<P class=jiansouyu><FONT color=#800000>一个布局可以有多个视口,所以你只能以当前视口来定比例,不同的视口会不同的比例,这一点比较难控制,你可能改变了一个视口中的对象比例,其实也改变了其它视口中的比例,因为它们可能是同一个对象。</FONT></P>
<P class=jiansouyu><FONT color=#800000>但如果你在布局中只有一个视口或你只利用一个视口来显示模型空间中的对象的话,则没有问题。<BR>在视口的帮助文件中可以看到以下的内容:</FONT></P>
<P class=jiansouyu><FONT color=#800000>The ZOOM XP factor is calculated with the following formula: group_41 / 2nd_group_1040 (or pspace_height / mspace_height). </FONT></P>
<P class=jiansouyu><FONT color=#800000>也就是说比例是视口的高度除以模型空间的高度。也可以是视口中的组码41的值除以扩展数据中的第二个组码1040的值。</FONT></P>
<P class=jiansouyu><FONT color=#800000>以上适用于R14版,在2000版时,视口的扩展数据部分已经作了改动,这个比例应该是视口中的组码41的值除以组码45的值。</FONT></P>
<P class=jiansouyu><FONT color=#800000>补充:</FONT></P>
<P class=jiansouyu><FONT color=#800000>在AX控制中,视口中有</FONT><FONT color=#000000>StandardScale属性和<A href="http://www.mjtd.com/object/acad2004/idh_customscale.htm" target="_blank" >CustomScale</A>属性,通过这两个属性可以取得或控制当前的视口比例。当StandardScale设置为acVpCustomScale时,则通过CustomScale属性来控制视口比例。</FONT></P>
<P class=jiansouyu><FONT color=#000000>对于函数的书写,其实就是参照和返回值的问题。其它和写程序一样。</FONT></P>
<P class=jiansouyu><FONT color=#000000>如果不太清楚,可先写程序,然后看程序需要什么参数,需要返回什么内容。再改造成函数就可以。</FONT></P> <P>老大,ET中的程序求视口比例是现成的:</P>
<P>(defun c:vpscale (/ ent data cvsize cvhgt units vpna flag)<BR> (cond<BR> ((not (equal 0 (getvar "tilemode")))<BR> (princ "\n 命令不执行直至TILEMODE设为0 ") <BR> )<BR> ((and (/= 1 (getvar "cvport"))<BR> (setq vpna (acet-currentviewport-ename))<BR> (equal 1 (logand 1 (cdr (assoc 90 (entget vpna)))))<BR> )<BR> (princ "\n 在透视视图中不能执行命令 ") <BR> )<BR> (T<BR> <BR> (acet-error-init<BR> (list<BR> (list "cmdecho" 0<BR> "luprec" (getvar "luprec")<BR> "dimzin" 8<BR> )<BR> T ;flag. True means use undo for error clean up.<BR> <BR> );list<BR> );acet-error-init<BR> <BR> <BR> (if (paper)<BR> ;(setq ent (car (entsel "\nSelect edge of viewport: ")))<BR> <BR> ;;Added the following code to replace the above line. Irregularly shaped floating viewports actuall<BR> ;;consist fo two entities (a pline and a viewport) with reactors on each other to point to each other<BR> ;;so a simple (entsel) returned a pline instead of a viewport. Had to uise the built-in filtering<BR> ;;capability of 'acet-ui-single-select' to get around this problem.<BR> (progn<BR> (while (not flag)<BR> (princ "\n选择视口的边。")<BR> (setq ent (acet-ui-single-select '((0 . "viewport")) T )) ;setq<BR> (if (and ent<BR> (= 1 (logand 1 (cdr (assoc 90 (entget ent)))))<BR> )<BR> (progn<BR> (princ "\n不允许为有透视视图的视口。")<BR> (setq flag nil)<BR> );progn<BR> (setq flag T)<BR> );if<BR> );while<BR> );progn<BR> (setq ent (acet-currentviewport-ename))<BR> )<BR> (cond<BR> ((and<BR> ent<BR> (setq data (entget ent '("ACAD")))<BR> (= "VIEWPORT" (acet-dxf 0 DATA))<BR> );and<BR> (setq cvhgt (acet-dxf 41 DATA) ; viewport height<BR> cvsize (cdr (getx 6 data)) ; viewsize from extended data<BR> )<BR> (prompt "\nPS:MS == ")<BR> (cond<BR> ((< cvsize cvhgt)<BR> (princ (rtos (/ cvhgt cvsize) 2))<BR> (princ ":1")<BR> )<BR> (T (princ "1:")<BR> (princ (rtos (/ cvsize cvhgt) 2))<BR> )<BR> );cond<BR> (setq units (getvar "lunits"))<BR> (setvar "luprec" 8)<BR> (cond<BR> ((= units 4)<BR> (prompt (strcat "\n视口比例: " (rtos (/ 12 (/ cvsize cvhgt))) " = 1'-0\""))<BR> )<BR> ((= units 3)<BR> (prompt (strcat "\n视口比例: 1\" = " (rtos (/ cvsize cvhgt))))<BR> )<BR> )<BR> )<BR> (T (prompt " 没有发现视口。"))<BR> );cond<BR> (acet-error-restore) ; Retsore values<BR> )<BR> );cond close <BR> (princ)<BR>);c:vpscale<BR></P>
<P>你还是没看明白我题目的要求哇,我不知道如何才是“改造成函数”。</P> <P>程序</P>
<P>(defun c: xxx ()</P>
<P> (setq a (getpoint ....)</P>
<P> b (getstring ...))</P>
<P> ....)</P>
<P>改造为函数:</P>
<P>(defun xxx (a b / ...)</P>
<P> .....</P>
<P>)</P>
<P>函数调用:</P>
<P>(setq a ...</P>
<P> b ...)</P>
<P>(xxx a b)</P> 原来还是子程序。 丁小妹,哈哈, 几年我没上来, 就看到你的帖子了, 我也不懂. 你好进步啊! xixi 本帖最后由 作者 于 2007-1-31 21:08:56 编辑
很简单.
把程序要求的写成参数就可以了.
;;;vp:viewport entity name.
(defun getvpscale(vp /)
(cond
((not (equal 0 (getvar "tilemode")))
(princ "\n命令不执行直至TILEMODE设为0")
)
((and (/= 1 (getvar "cvport"))
(setq vpna (acet-currentviewport-ename))
(equal 1 (logand 1 (cdr (assoc 90 (entget vpna)))))
)
(princ "\n在透视视图中不能执行命令")
)
(T
(acet-error-init
(list
(list "cmdecho" 0
"luprec" (getvar "luprec")
"dimzin" 8
)
T ;flag. True means use undo for error clean up.
);list
);acet-error-init
(if (paper)
;(setq ent (car (entsel "\nSelect edge of viewport: ")))
;;Added the following code to replace the above line.Irregularly shaped floating viewports actuall
;;consist fo two entities (a pline and a viewport) with reactors on each other to point to each other
;;so a simple (entsel) returned a pline instead of a viewport. Had to uise the built-in filtering
;;capability of 'acet-ui-single-select' to get around this problem.
(progn
(while (not flag)
(princ "\n选择视口的边。")
(setq ent vp) ;setq
(if (and ent
(= 1 (logand 1 (cdr (assoc 90 (entget ent)))))
)
(progn
(princ "\n不允许为有透视视图的视口。")
(setq flag nil)
);progn
(setq flag T)
);if
);while
);progn
(setq ent (acet-currentviewport-ename))
)
(cond
((and
ent
(setq data (entget ent '("ACAD")))
(= "VIEWPORT" (acet-dxf 0 DATA))
);and
(setq cvhgt(acet-dxf 41 DATA); viewport height
cvsize (cdr (getx 6 data)) ; viewsize from extended data
)
(prompt "\nPS:MS == ")
(cond
((< cvsize cvhgt)
(princ (rtos (/ cvhgt cvsize) 2))
(princ ":1")
)
(T (princ "1:")
(princ (rtos (/ cvsize cvhgt) 2))
)
);cond
(setq units (getvar "lunits"))
(setvar "luprec" 8)
(cond
((= units 4)
(prompt (strcat "\n视口比例: " (rtos (/ 12 (/ cvsize cvhgt))) " = 1'-0\""))
)
((= units 3)
(prompt (strcat "\n视口比例: 1\" = " (rtos (/ cvsize cvhgt))))
)
)
)
(T (prompt " 没有发现视口。"))
);cond
(acet-error-restore) ; Retsore values
)
);cond close
)
页:
[1]
2