tmelancon 发表于 2022-7-5 16:10:16

输入平面尺寸(MM)

在完成绘制/转换管道草图后,我们运行c:dtext并沿管道输入圆角尺寸(即,如果其为13’-6“我们输入14”),以便让我们的技术人员在执行检查之前了解特定管道的跨度。在处理imperial时,这很容易,没有问题。
 
然而,有时在CAD中,我们使用的是以毫米为单位的施工图,我们必须将这些尺寸转换为英尺。我只是创建了一个可打印的图表,允许我们的用户快速浏览和查看毫米范围,以便他们可以以英尺为单位输入尺寸(即1219-1523mm,我们将为该运行键入4’)。这是可行的,但我想我可以更进一步,帮助我的员工通过编程方式进入这些维度。
 
我已经写了一些东西,我必须感谢塔瓦的代码,他让我写下了至少需要开始的东西。非常感谢!!
 
我现在所做的工作完美无瑕,唯一的问题是我希望我可以修改代码,使其四舍五入,而不是增加英寸。我只想把整数四舍五入到英尺(即13’-6”到14’,18’-2”到18”)。以下是我一直在研究的代码:
 
(defun c:mm2in (/ in ss)
;; ==================================================    ;;
;;    Author : Tharwat Al Shoufi .Date: 22.Nov.2014    ;;
;;    Converts Text Strings from Millimeter to Inch    ;;
;; ==================================================    ;;
(if (setq in (/ 1. 25.4)
         ss (ssget "_:L"
                     '((0 . "TEXT,MTEXT")
                     (1 . "1*,2*,3*,4*,5*,6*,7*,8*,9*,x*,X*")
                      )
            )
   )
   ((lambda (x / sn e s a)
      (while (setq sn (ssname ss (setq x (1+ x))))
      (entmod
          (subst
            (cons
            1
            (if (wcmatch
                  (setq
                      a (strcase
                        (substr
                            (setq
                              s (cdr (assoc 1 (setq e (entget sn))))
                            )
                            1
                            1
                        )
                        )
                  )
                  "X*"
                  )
                (if (/= (atof (substr s 2)) 0.)
                  (strcat a (rtos (* (atof (substr s 2)) in) 4 0))
                  s
                )
                (rtos (* (atof s) in) 4 0)
            )
            )
            (assoc 1 e)
            e
          )
      )
      )
    )
   -1
   )
)
(princ)
)

;; ==================================================    ;;
;;    Author : T.Melancon Date: 27Jun2017    ;;
;;    Allows user to enter MM in plain text then converts to FT               ;;
;;    Loops so user can enter multiple dimensions                                  ;;
;; ==================================================    ;;

(defun c:dimm()
(setq oldlayr (getvar "clayer"))
(setq t_size 0.08)
(COMMAND "LAYER" "S" "DIM" "")
(WHILE
(SETQ POINT (GETPOINT "\nSpecify Point For Text Insertion..."))
(SETQ DIMS (GETSTRING "\nEnter Dimensions In MM: "))
(command "._text" "L" POINT t_size "0" DIMS)
(sssetfirst nil (ssget "L"))
(C:MM2IN)
)
(SETVAR "CLAYER" OLDLAYR)
(PRINC))

BIGAL 发表于 2022-7-5 16:15:39

如果你取mm除以304.8,得到的是小数点后的英尺,所以将答案4419=14.5英尺四舍五入,得到15'
 
只需在这里搜索“round”,这里有一些示例。

tmelancon 发表于 2022-7-5 16:20:24

比格尔,谢谢你的回复。我一直在努力搜索“round”代码和示例。我不会停止,直到我得到什么。我希望我能更好地理解不同的评价和表达。我将能够更快地解释更多高级代码。我会到达那里。现在我发现了这一点,我认为这是我正在寻找的,我只是努力知道从哪里开始进行调整,并将其放入我现有的代码中。如果你想帮点忙,我会把这件事留给你。我不想来到这里向任何人索要任何东西。我愿意投入这项工作。我会继续努力,看看结果如何。与此同时,看看我在下面找到了什么。。
 

tmelancon 发表于 2022-7-5 16:23:40

我得到了它。我回到了基础,从头开始执行,并尽可能地保持基础。如果你们有什么意见,那就太好了。
 
此外,如果有人想在我弄明白之前插话,我注意到任何304mm及以下的结果都显示为0。我想做任何小于304mm的东西来显示为
 
以下是适合我的:
 
(defun c:dimm (/ oldlayr t_size point dims DFT DIMSFT)
(setq oldlayr (getvar "clayer"))
(setq t_size 0.08)
(COMMAND "LAYER" "S" "DIM" "")
(WHILE
   (SETQ POINT (GETPOINT "\nSpecify Point For Dimension Insertion..."))
    (SETQ DIMS (GETSTRING "\nEnter Dimensions In MM: "))
    (SETQ DFT (ATOF DIMS))
    (SETQ DIMSFT (STRCAT (RTOS (FIX (/ DFT 304.) 2 0) "'"))
    (command "._text" "MC" POINT t_size "0" DIMSFT)
)
(SETVAR "CLAYER" OLDLAYR)
(PRINC)
)

tmelancon 发表于 2022-7-5 16:26:13

我能找到答案。我只是想和你们分享一下。任何关于改进的建议都将被采纳。总是考虑不同的方法。感谢BIGAL的支持!
 
(defun c:dimm (/ *ERROR* oldlayr t_size point dims DFT DIMSFT)
(setvar "cmdecho" 0)
(defun *error* (msg)
   (if    oldlayr
   (setvar "clayer" oldlayr)
   )
)
(setq oldlayr (getvar "clayer"))
(setq t_size 0.08)
(COMMAND "LAYER" "S" "DIM" "")
(WHILE
   (SETQ POINT (GETPOINT "\nSpecify Point For Dimension Insertion..."))
    (SETQ DIMS (GETSTRING "\nEnter Dimensions In MM: "))
    (SETQ DFT (ATOF DIMS))
    (COND ((< DFT 303)
       (SETQ DIMSFT "<1'")
       (command "._text" "MC" POINT t_size "0" DIMSFT)
      )
      ((> DFT 303)
       (SETQ DIMSFT (STRCAT (RTOS (FIX (/ DFT 304.) 2 0) "'"))
       (command "._text" "MC" POINT t_size "0" DIMSFT)
      )
    )
)
(SETVAR "CLAYER" OLDLAYR)
(PRINC)
)

ronjonp 发表于 2022-7-5 16:32:06

很好,罗恩·琼普,我对它的编码感到非常兴奋,我忘记了假设场景。无论如何,我还添加了-设置颜色为蓝色,以暗淡层,如果它不存在。这就完成了层的创建。干杯
 
(command "LAYER"
   (if (tblobjname "layer" "DIM")
   "S"
   "M"
   )
   "DIM"
   ""
)

tmelancon 发表于 2022-7-5 16:32:54

一直在论坛上阅读不同的东西,更新了一些代码。如果有人有什么需要改进的地方,我洗耳恭听:
 
(command "LAYER"
      (if (tblobjname "layer" "DIM")
      "S"
      "M"
      )
      "DIM"
      "C"
      "5"
      "DIM"
      ""
)
 
 
例子:
(defun c:dimm (/ *ERROR* oldlayr dims DFT DIMSFT ent)
(setvar "cmdecho" 0)
(defun *error* (msg)
   (if    oldlayr
   (setvar "clayer" oldlayr)
   )
)
(setq oldlayr (getvar "clayer"))
(command "LAYER"
      (if (tblobjname "layer" "DIM")
      "S"
      "M"
      )
      "DIM"
          "C"
          "5"
          "DIM"
          ""
)
(WHILE
    (SETQ DIMS (GETSTRING "\nEnter Dimensions In MM: "))
    (SETQ DFT (ATOF DIMS))
    (COND ((< DFT 303)
       (SETQ DIMSFT "<1'")
            (setq ent (entmakex
            (list '(0 . "TEXT")
                (cons 10 '(0 0 0))
                            (cons 40 0.08)
                            (cons 7 (getvar "TEXTSTYLE"))
                            (cons 1 DIMSFT))))
            (command "_cutclip" ent "" "_pasteclip" pause)
      )
      ((> DFT 303)
       (SETQ DIMSFT (STRCAT (RTOS (FIX (/ DFT 304.) 2 0) "'"))
            (setq ent (entmakex
            (list '(0 . "TEXT")
                (cons 10 '(0 0 0))
                            (cons 40 0.08)
                            (cons 7 (getvar "TEXTSTYLE"))
                            (cons 1 DIMSFT))))
            (command "_cutclip" ent "" "_pasteclip" pause)
      )
    )
)
(SETVAR "CLAYER" OLDLAYR)
(PRINC)
)

tmelancon 发表于 2022-7-5 16:39:42

准确地添加线型。当你为一家公司编写代码时,它使标准化层名称等变得更加容易。

BIGAL 发表于 2022-7-5 16:42:46

好的,我对代码进行了更多的改进,我认为它工作得很好。我的朋友们都很喜欢它,对于那些在论坛上使用它并且喜欢它的人,我希望它能很好地满足你的需要。我现在在文本插入中使用GRREAD。
 
我只是不知道如何以及在哪里编辑代码,这样当用户确实输入MM,但希望退出命令而不是放置FT时,它会删除输入。此时,它只是将条目放在CAD中光标所在的任何位置。看一看,如果你能增值,请插话。谢谢,上帝保佑。
 
(defun laychk (lname col)
(if (not col)
    (setq col "5"))
(if (not (tblsearch "layer" lname))
    (command "layer" "n" lname "c" col lname ""))
(princ))

tmelancon 发表于 2022-7-5 16:45:34

Grrrrrrr。。好的,在刚刚使用它之后,我注意到一个问题,显然我写错了这个方法,因为如果用户进入例程,输入值,放置值,然后选择esc退出例程,它总是删除先前添加的实体。当我今天有时间的时候,我会一直努力想办法。
 
我希望例行程序:
1、提示取值
2、允许用户放置值
3.如果用户想要输入更多,则循环
4.esc干净退出,保留以前输入的值或
5.如果用户意外输入另一个值,但不再需要该值
6.点击esc退出例程,然后删除当前在光标(grread)上等待放置的值-保留用户刚刚放置的现有值。
页: [1] 2
查看完整版本: 输入平面尺寸(MM)