woodman78 发表于 2022-7-6 10:14:23

视口比例

我正在设置一个列表,根据视口比例将dimstyle和leader样式设置为默认值。(如果图形为1:100,则该样式将成为默认样式)。我把这变成了一个手动过程,但在尝试计算视口比例(自定义比例)时,我能想到的只是JTB世界中的一个例子:;;;getvpscale。lsp

;;;
;;; Get Viewport Scale in active viewport or in selected
;;; Supports viewports with clipping boundary
;;; By Jimmy Bergmark
;;; Copyright (C) 1997-2006 JTB World, All Rights Reserved
;;; Website: www.jtbworld.com
;;; E-mail: info@jtbworld.com
;;; 2000-05-03 - First release
;;; 2000-05-09 - Detects perspective view
;;; Tested on AutoCAD 2000
(defun c:getvpscale (/ ss ent)
(defun printscale (/data cvsize cvhgt)
(setq cvscale (vla-get-customscale (vlax-ename->vla-object ent)))
(princ "\nPS:MS == ")
(cond
   ((> cvscale 1)
    (princ (rtos cvscale 2))
    (princ ":1")
   )
   (T
    (princ "1:")
    (princ (rtos (/ 1 cvscale) 2))
   )
)
)
(vl-load-com)
(if (= (getvar "tilemode") 0)
   (if (= (getvar "cvport") 1)
   (if (/= (setq ss (ssget ":E:S" '((0 . "VIEWPORT")))) nil)
       (if (/= 1 (logand 1 (cdr (assoc 90 (entget (setq ent (ssname ss 0)))))))
         (printscale)
         (princ "\n Command not allowed in perspective view.")
       )
       (princ " No viewport found.")
   )
   (progn
       (setq ent (vlax-vla-object->ename
                   (vla-get-activepviewport
                     (vla-get-activedocument (vlax-get-acad-object)))))
       (if (/= 1 (logand 1 (cdr (assoc 90 (entget ent)))))
         (printscale)
         (princ "\n Command not allowed in perspective view.")
       )
   )
   )
   (princ "\n Command not allowed unless TILEMODE is set to 0.")
)
(princ)
)
;;; return viewport scale if allowed else nil
(defun getvpscale1 (/ ss ent)
(vl-load-com)
(if (= (getvar "tilemode") 0)
   (if (= (getvar "cvport") 1)
   (if (/= (setq ss (ssget ":E:S" '((0 . "VIEWPORT")))) nil)
       (if (/= 1 (logand 1 (cdr (assoc 90 (entget (setq ent (ssname ss 0)))))))
         (vla-get-customscale (vlax-ename->vla-object ent))
       )
   )
   (progn
       (setq ent (vlax-vla-object->ename
                   (vla-get-activepviewport
                     (vla-get-activedocument (vlax-get-acad-object)))))
       (if (/= 1 (logand 1 (cdr (assoc 90 (entget ent)))))
         (vla-get-customscale (vlax-ename->vla-object ent))
       )
   )
   )
)
)
;;; return viewport scale if allowed else nil
;;; no support for perspective view
(defun getvpscale2 (/ ss vpno vpsc)
(if (= (getvar "tilemode") 0)
   (if (= (getvar "cvport") 1)
   (if (/= (setq ss (ssget ":E:S" '((0 . "VIEWPORT")))) nil)
       (progn
         (setq vpno (cdr (assoc 69 (entget (ssname ss 0)))))
         (command "_.mspace")
         (setvar "cvport" vpno)
         (setq vpsc (caddr (trans '(0 0 1) 2 3)))
         (command "_.pspace")
         vpsc
       )
   )
   (caddr (trans '(0 0 1) 2 3))
   )
)
)
;;; return viewport scale
;;; no support for viewports with clipping boundary
;;; no support for perspective view
(defun getvpscale3(/ vpno vpsc)
(setq vpno (cdr (assoc 69 (entget (car (entsel))))))
(command "mspace")
(setvar "cvport" vpno)
(setq vpsc (caddr (trans '(0 0 1) 2 3)))
(command "pspace")
vpsc
)
;;; return scale in active viewport
;|
(caddr (trans '(0 0 1) 2 3))
|;

 
 
我需要经历所有这些才能得到视口比例吗??

alanjt 发表于 2022-7-6 10:18:00

(/ 1. (vla-get-customscale (vlax-ename->vla-object (car (entsel)))))

Lee Mac 发表于 2022-7-6 10:22:07

另一个,对于那些厌恶VL的人。。。
 

(defun VPScale ( / e )
(cond
   (
   (and (setq e (car (entsel)))
          (eq "VIEWPORT" (cdr (assoc 0 (setq e (entget e)))))
   )
   (/ (cdr (assoc 45 e)) (cdr (assoc 41 e)))
   )
)
)

woodman78 发表于 2022-7-6 10:26:21

谢谢各位,
这是我到目前为止为lisp准备的,我想用它来加载暗显和引线样式,并根据视口比例设置默认值。

(defun c:dim_Load(/e b c)
(command "_.insert" "CCC_Drawing_Dim_Leader_Styles=" nil)
(command "_.purge" "_b" "CCC_Drawing_Dim_Leader_Styles" "_n")
(progn
(cond
   (
   (and (setq e (car (entsel)))
          (eq "VIEWPORT" (cdr (assoc 0 (setq e (entget e)))))
   )
   (/ (cdr (assoc 45 e)) (cdr (assoc 41 e)))
   )
)
)
(progn
   (cond
   ((= e 0.02)(setq b "CCC_1_50000_Dims")(setq c "CCC_Leader_1_50000"))
   ((= e 0.04)(setq b "CCC_1_25000_Dims")(setq c "CCC_Leader_1_25000"))
   ((= e 0.05)(setq b "CCC_1_20000_Dims")(setq c "CCC_Leader_1_20000"))
   ((= e 0.1)(setq b "CCC_1_10000_Dims")(setq c "CCC_Leader_1_10000"))
   ((= e 0.2)(setq b "CCC_1_5000_Dims")(setq c "CCC_Leader_1_5000"))
   ((= e 0.4)(setq b "CCC_1_2500_Dims")(setq c "CCC_Leader_1_2500"))
   ((= e 0.5)(setq b "CCC_1_2000_Dims")(setq c "CCC_Leader_1_2000"))
   ((= e 0.(setq b "CCC_1_1250_Dims")(setq c "CCC_Leader_1_1250"))
   ((= e 1)(setq b "CCC_1_1000_Dims")(setq c "CCC_Leader_1_1000"))
   ((= e 2)(setq b "CCC_1_500_Dims")(setq c "CCC_Leader_1_500"))
   ((= e 4)(setq b "CCC_1_250_Dims")(setq c "CCC_Leader_1_250"))
   ((= e 5)(setq b "CCC_1_200_Dims")(setq c "CCC_Leader_1_200"))
   ((= e (setq b "CCC_1_125_Dims")(setq c "CCC_Leader_1_125"))
   ((= e 10)(setq b "CCC_1_100_Dims")(setq c "CCC_Leader_1_100"))
   ((= e 20)(setq b "CCC_1_50_Dims")(setq c "CCC_Leader_1_50"))
   ((= e 40)(setq b "CCC_1_25_Dims")(setq c "CCC_Leader_1_25"))
   ((= e 50)(setq b "CCC_1_20_Dims")(setq c "CCC_Leader_1_20"))
   ((= e 100)(setq b "CCC_1_10_Dims")(setq c "CCC_Leader_1_10"))
   )
)
(command "_.dimstyle" "r" b)

(princ)
)

 
关于“争论太少”,我有一些错误。有人能指出错误在哪里吗?谢谢

The Buzzard 发表于 2022-7-6 10:27:48

伍德曼78,
 
你又做了一次,慢点!

;
You have this.
(defun c:dim_Load(/e b c)
;
Do this.
(defun c:dim_Load (/ e b c)
;

 
在斜线和e之间留一个空格。
我以前跟你提过好几次。你真的需要练习更好的格式化。
 
另一件事,它与这个问题无关。
去掉progn,如果您使用cond,则不需要它。如果是如果,那就另当别论了。

(progn
(cond
(
(and (setq e (car (entsel)))
       (eq "VIEWPORT" (cdr (assoc 0 (setq e (entget e)))))
)
(/ (cdr (assoc 45 e)) (cdr (assoc 41 e)))
)
)
)
(progn
   (cond
   ((= e 0.02)(setq b "CCC_1_50000_Dims")(setq c "CCC_Leader_1_50000"))
   ((= e 0.04)(setq b "CCC_1_25000_Dims")(setq c "CCC_Leader_1_25000"))
   ((= e 0.05)(setq b "CCC_1_20000_Dims")(setq c "CCC_Leader_1_20000"))
   ((= e 0.1)(setq b "CCC_1_10000_Dims")(setq c "CCC_Leader_1_10000"))
   ((= e 0.2)(setq b "CCC_1_5000_Dims")(setq c "CCC_Leader_1_5000"))
   ((= e 0.4)(setq b "CCC_1_2500_Dims")(setq c "CCC_Leader_1_2500"))
   ((= e 0.5)(setq b "CCC_1_2000_Dims")(setq c "CCC_Leader_1_2000"))
   ((= e 0.(setq b "CCC_1_1250_Dims")(setq c "CCC_Leader_1_1250"))
   ((= e 1)(setq b "CCC_1_1000_Dims")(setq c "CCC_Leader_1_1000"))
   ((= e 2)(setq b "CCC_1_500_Dims")(setq c "CCC_Leader_1_500"))
   ((= e 4)(setq b "CCC_1_250_Dims")(setq c "CCC_Leader_1_250"))
   ((= e 5)(setq b "CCC_1_200_Dims")(setq c "CCC_Leader_1_200"))
   ((= e (setq b "CCC_1_125_Dims")(setq c "CCC_Leader_1_125"))
   ((= e 10)(setq b "CCC_1_100_Dims")(setq c "CCC_Leader_1_100"))
   ((= e 20)(setq b "CCC_1_50_Dims")(setq c "CCC_Leader_1_50"))
   ((= e 40)(setq b "CCC_1_25_Dims")(setq c "CCC_Leader_1_25"))
   ((= e 50)(setq b "CCC_1_20_Dims")(setq c "CCC_Leader_1_20"))
   ((= e 100)(setq b "CCC_1_10_Dims")(setq c "CCC_Leader_1_10"))
   )
)

rkmcswain 发表于 2022-7-6 10:30:49

 
甚至。。。。
 

(caddr (trans '(0 0 1) 2 3))

David Bethel 发表于 2022-7-6 10:34:26

 
也许是第40组代替第45组?
 

(trans '(0 0 1) 2 3)

 
如果目标和摄像机系统变量不是面向WCS的'(0 0)与'(0 0 1),请注意2参数
 
(命令“_.MSPACE”“_.DVIEW”“”“\u PO”“(2 3 4)'(4 5 6)”)
 
-大卫

woodman78 发表于 2022-7-6 10:39:14

我一直在尝试查看变量e是否设置为视口比例。我添加了一个警报框来显示e的值,但我不断地出错。
 

(defun c:dim_Load(/ e b c)
(command "_.insert" "CCC_Drawing_Dim_Leader_Styles=" nil)
(command "_.purge" "_b" "CCC_Drawing_Dim_Leader_Styles" "_n")
(cond
   (
   (and (setq e (car (entsel)))
          (eq "VIEWPORT" (cdr (assoc 0 (setq e (entget e)))))
   )
   (/ (cdr (assoc 40 e)) (cdr (assoc 41 e)))
   )
)
(alert "Viewport Scale"e)
   (cond
   ((= e 0.02)(setq b "CCC_1_50000_Dims")(setq c "CCC_Leader_1_50000"))
   ((= e 0.04)(setq b "CCC_1_25000_Dims")(setq c "CCC_Leader_1_25000"))
   ((= e 0.05)(setq b "CCC_1_20000_Dims")(setq c "CCC_Leader_1_20000"))
   ((= e 0.1)(setq b "CCC_1_10000_Dims")(setq c "CCC_Leader_1_10000"))
   ((= e 0.2)(setq b "CCC_1_5000_Dims")(setq c "CCC_Leader_1_5000"))
   ((= e 0.4)(setq b "CCC_1_2500_Dims")(setq c "CCC_Leader_1_2500"))
   ((= e 0.5)(setq b "CCC_1_2000_Dims")(setq c "CCC_Leader_1_2000"))
   ((= e 0.(setq b "CCC_1_1250_Dims")(setq c "CCC_Leader_1_1250"))
   ((= e 1)(setq b "CCC_1_1000_Dims")(setq c "CCC_Leader_1_1000"))
   ((= e 2)(setq b "CCC_1_500_Dims")(setq c "CCC_Leader_1_500"))
   ((= e 4)(setq b "CCC_1_250_Dims")(setq c "CCC_Leader_1_250"))
   ((= e 5)(setq b "CCC_1_200_Dims")(setq c "CCC_Leader_1_200"))
   ((= e (setq b "CCC_1_125_Dims")(setq c "CCC_Leader_1_125"))
   ((= e 10)(setq b "CCC_1_100_Dims")(setq c "CCC_Leader_1_100"))
   ((= e 20)(setq b "CCC_1_50_Dims")(setq c "CCC_Leader_1_50"))
   ((= e 40)(setq b "CCC_1_25_Dims")(setq c "CCC_Leader_1_25"))
   ((= e 50)(setq b "CCC_1_20_Dims")(setq c "CCC_Leader_1_20"))
   ((= e 100)(setq b "CCC_1_10_Dims")(setq c "CCC_Leader_1_10"))
   )
(command "_.dimstyle" "r" b)

(princ)
)

David Bethel 发表于 2022-7-6 10:41:47

我不太明白你想做什么,但是:
 

(defun c:db-vps (/ cv ss en ed ys vs)
(if (/= (getvar "TILEMODE") 0)
   (setvar "TILEMODE" 0))
(if (/= (getvar "CVPORT") 1)
   (progn
      (setq ss (ssget "X" (list (cons 0 "VIEWPORT")(cons 69 (getvar "CVPORT"))))
            en (ssname ss 0)
            ed (entget en)
            cv (cdr (assoc 69 ed))
            ys (cdr (assoc 41 ed)))
      (command "_.MSPACE")
      (setvar "CVPORT" cv)
      (setq vs (getvar "VIEWSIZE"))
      (princ (strcat "\nThe VIEWPORT Scale is 1 = " (rtos (/ vs ys) 2 4)))
      (princ (strcat "\nThe VIEWPORT Scale is " (rtos (/ ys vs) 2 8) " = 1")))
   (alert "\nYour Are Not In An Active MODELSPACE Viewport"))
(prin1))

 
(/dxf40 dxf41)仅提供视口的x与y比例。没什么用。
 
 
如果要使用比较,则需要将(equal)与fuzz一起使用-大卫

The Buzzard 发表于 2022-7-6 10:44:47

 
我也不确定你到底在做什么。我知道你没有像以前那样犯那个论点错误。该程序正在寻找一些我认为是你没有提供的dimstyle,所以进一步检查是有限的。
页: [1] 2
查看完整版本: 视口比例