明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2404|回复: 11

怎样写成函数形式?

[复制链接]
发表于 2006-10-23 23:03:00 | 显示全部楼层 |阅读模式

记得meflying说过一下,当时不明白,现在都不明白。

现在我想让ET工具中查询视口比例的程序,将其结果传出来给我的程序用,因为我肯定写不出这么完善的程序。

比例一般是1:X或Y:1两种形式,如果是(X Y)形式表达,当X值为0,我就知道是取Y值。

不知说清楚没有?

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2006-10-24 16:39:00 | 显示全部楼层
相当难懂~~~
发表于 2006-10-24 17:34:00 | 显示全部楼层
这样的内容只能只有小飞才能看懂。
 楼主| 发表于 2006-10-24 18:00:00 | 显示全部楼层

老大,我想改写ET中的查询视口比例程序,变成子程序一样,随自己调用,(粗糙度标注程序,在不同比例的视口中,自动取比例值。)。

我记得以前飞版主说过:函数不会调用?

你都知道ssget函数是这样调用:(setq endata (entget (car _types ))),,,

为何把SSGET换成我定义的函数就不会用了?

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=19222

如果写成函数形式,(我现在还没明白,怎么写法),就比子程序好用,我是这样想。

(点解打字甘难噶!唔知清楚点没)

 

 

 

发表于 2006-10-25 06:57:00 | 显示全部楼层

这是2000年明经杂志的文章内容,供参考:

在布局中的视图称为视口viewport。

一个布局可以有多个视口,所以你只能以当前视口来定比例,不同的视口会不同的比例,这一点比较难控制,你可能改变了一个视口中的对象比例,其实也改变了其它视口中的比例,因为它们可能是同一个对象。

但如果你在布局中只有一个视口或你只利用一个视口来显示模型空间中的对象的话,则没有问题。
在视口的帮助文件中可以看到以下的内容:

The ZOOM XP factor is calculated with the following formula: group_41 / 2nd_group_1040 (or pspace_height / mspace_height). 

也就是说比例是视口的高度除以模型空间的高度。也可以是视口中的组码41的值除以扩展数据中的第二个组码1040的值。

以上适用于R14版,在2000版时,视口的扩展数据部分已经作了改动,这个比例应该是视口中的组码41的值除以组码45的值。

补充:

在AX控制中,视口中有StandardScale属性和CustomScale属性,通过这两个属性可以取得或控制当前的视口比例。当StandardScale设置为acVpCustomScale时,则通过CustomScale属性来控制视口比例。

对于函数的书写,其实就是参照和返回值的问题。其它和写程序一样。

如果不太清楚,可先写程序,然后看程序需要什么参数,需要返回什么内容。再改造成函数就可以。

 楼主| 发表于 2006-10-25 14:55:00 | 显示全部楼层

老大,ET中的程序求视口比例是现成的:

(defun c:vpscale (/ ent data cvsize cvhgt units vpna flag)
 (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 (acet-ui-single-select '((0 . "viewport")) T )) ;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
  (princ)
);c:vpscale

你还是没看明白我题目的要求哇,我不知道如何才是“改造成函数”。

发表于 2006-10-26 12:36:00 | 显示全部楼层

程序

(defun c: xxx ()

   (setq  a (getpoint ....)

             b (getstring ...))

  ....)

改造为函数:

(defun xxx (a b / ...)

  .....

)

函数调用:

(setq a ...

        b ...)

(xxx  a b)

 楼主| 发表于 2006-10-26 23:26:00 | 显示全部楼层
原来还是子程序。
发表于 2006-10-27 10:44:00 | 显示全部楼层
丁小妹,哈哈, 几年我没上来, 就看到你的帖子了, 我也不懂. 你好进步啊! xixi
发表于 2007-1-31 21:06:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-31 21:08:56 编辑

很简单.
把程序要求的写成参数就可以了.
  1. ;;;vp:viewport entity name.
  2. (defun getvpscale(vp /)
  3. (cond
  4.   ((not (equal 0 (getvar "tilemode")))
  5.    (princ "\n  命令不执行直至TILEMODE设为0  ")
  6.   )
  7.   ((and (/= 1 (getvar "cvport"))
  8.         (setq vpna (acet-currentviewport-ename))
  9.         (equal 1 (logand 1 (cdr (assoc 90 (entget vpna)))))
  10.    )
  11.    (princ "\n  在透视视图中不能执行命令  ")
  12.   )
  13.   (T
  14.       (acet-error-init
  15.         (list
  16.           (list "cmdecho" 0
  17.                 "luprec" (getvar "luprec")
  18.                 "dimzin" 8
  19.           )
  20.           T     ;flag. True means use undo for error clean up.
  21.         );list
  22.       );acet-error-init
  23.       (if (paper)
  24.         ;(setq ent (car (entsel "\nSelect edge of viewport: ")))
  25.        ;;Added the following code to replace the above line.  Irregularly shaped floating viewports actuall
  26.        ;;consist fo two entities (a pline and a viewport) with reactors on each other to point to each other
  27.        ;;so a simple (entsel) returned a pline instead of a viewport. Had to uise the built-in filtering
  28.        ;;capability of 'acet-ui-single-select' to get around this problem.
  29.        (progn
  30.           (while (not flag)
  31.            (princ "\n选择视口的边。")
  32.            (setq ent vp) ;setq
  33.            (if (and ent
  34.                     (= 1 (logand 1 (cdr (assoc 90 (entget ent)))))
  35.                )
  36.                (progn
  37.                  (princ "\n不允许为有透视视图的视口。")
  38.                  (setq flag nil)
  39.                );progn
  40.                (setq flag T)
  41.            );if
  42.           );while
  43.         );progn
  44.         (setq ent (acet-currentviewport-ename))
  45.       )
  46.       (cond
  47.         ((and
  48.             ent
  49.             (setq data (entget ent '("ACAD")))
  50.             (= "VIEWPORT" (acet-dxf 0 DATA))
  51.          );and
  52.           (setq cvhgt  (acet-dxf 41 DATA)  ; viewport height
  53.                 cvsize (cdr (getx 6 data))    ; viewsize from extended data
  54.           )
  55.           (prompt "\nPS:MS == ")
  56.           (cond
  57.             ((< cvsize cvhgt)
  58.               (princ (rtos (/ cvhgt cvsize) 2))
  59.               (princ ":1")
  60.             )
  61.             (T (princ "1:")
  62.               (princ (rtos (/ cvsize cvhgt) 2))
  63.             )
  64.           );cond
  65.           (setq units (getvar "lunits"))
  66.           (setvar "luprec" 8)
  67.           (cond
  68.             ((= units 4)
  69.               (prompt (strcat "\n视口比例: " (rtos (/ 12 (/ cvsize cvhgt))) " = 1'-0""))
  70.             )
  71.             ((= units 3)
  72.               (prompt (strcat "\n视口比例: 1" = " (rtos (/ cvsize cvhgt))))
  73.             )
  74.           )
  75.         )
  76.         (T (prompt " 没有发现视口。"))
  77.       );cond
  78.       (acet-error-restore)                                  ; Retsore values
  79.   )
  80. );cond close
  81. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-29 03:33 , Processed in 0.188498 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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