rrulep 发表于 2022-7-5 22:50:51

可被整除的筛选文本值

请帮我过滤所有可以被5整除的文本。
 
提前感谢:)

rrulep 发表于 2022-7-5 23:00:11

请帮我编辑我写的代码
(defun c:div ()
(setq divi (getdist "Enter divisibility:"))
(setq layer (strcat "div_"(rtos divi 2 2)))
(if (setq ss (ssget "_X" '((0 . "TEXT"))))
(repeat (setq i (sslength ss))
(setq num (getreal (assoc 1 (entget (setq e (ssname ss (setq i (1- i))))))))
)
)
(command "-layer" "m" layer "")
(if
(= (rem num divi ) 0)
(command "_.chprop" e "" "_layer" layer "")
)
(princ)
)

hanhphuc 发表于 2022-7-5 23:09:29

 
你好,rrulep,
getreal通常为用户提示。
但我注意到它在一个重复循环中
我使用2007,以下是我的常规做法:
(setq num(atof(cdr(assoc 1(entget…))))))
 
 

rrulep 发表于 2022-7-5 23:14:16

我已经换了,但还是没用。
可能有什么错误?
你能试试吗?如果有效,请将其发回。
 
提前感谢

hanhphuc 发表于 2022-7-5 23:23:52

嗨,我没有更改任何内容,只是移动(命令“layer”…)在重复循环中。

(defun c:div(/ divi layer ss num i e dxf)
(setq divi (getreal "Enter divisibility: ");
        layer (strcat "div_" (rtos divi 2 2))
       dxf'((_e _i _val / _en)
        (setq _en (entget _e))
        (if (assoc _i _en)
           (entmod (subst (cons _i _val) (assoc _i _en) _en))
           (entmod (append _en (list (cons _i _val))))
           ) ; if
        (princ))
       )
(if (setq ss (ssget "_X" '((0 . "TEXT"))))
   (repeat (setq i (sslength ss))
   (setq num (atof (cdr (assoc 1 (entget (setq e (ssname ss (setq i (1- i)))))))))
   (command "-layer" "m" layer "")
   (if (= (rem num divi) 0)
;;;(command "_.chprop" e "" "_layer" layer "");
       (dxf e 8 layer))));*dxf code 8 is for Layer
(princ))

 
*在代码中使用(命令“-layer”)不是一个好做法,所以我替换entmod可能更快
 
;这只是您的简单代码,您可以添加错误处理程序、其他ssget过滤器等。。
祝你好运

jdiala 发表于 2022-7-5 23:24:47

(defun C:test (/ n i   s ss lay )
(if
   (setq n (getint "\nEnter divisibility:")
         ss (ssget "_X" '((0 . "TEXT")))
         lay (itoa n)
   )
   (progn
   (if
       (not (tblsearch "layer" (strcat "Div_" lay)))
         (entmake
         (list
             '(0 . "LAYER")
             '(100 . "AcDbSymbolTableRecord")
             '(100 . "AcDbLayerTableRecord")                                                                                                                      
            (cons 70 0)
            (cons 2 (strcat "Div_" lay))
         )
         )
   )
(setq lay (strcat "Div_" lay))
   (repeat (setq i (sslength ss))
       (if
         (multipleof (atof (cdr (assoc 1 (entget (setq s (ssname ss (setq i (1- i)))))))) n)
         (vla-put-layer (vlax-ename->vla-object s) lay)
        )
   )
)
)
(princ)
)
(defun multipleof (n x)
(while (> n x) (setq n (- n x)))
(if (= n x) t nil)
)

BIGAL 发表于 2022-7-5 23:35:19

一个简单的除数检查是余数必须是。0 35/5=5.0 36/5=5.2只需使用修复来检查是否。0

Stefan BMR 发表于 2022-7-5 23:39:13

过滤可被5整除的文本:
(ssget '((0 . "TEXT") (1 . "*")))
可以选择“a5”,并且不能被5整除。。。所以你可以添加过滤器,比如图层、样式、高度等等。
此外,如果要选择的数字在特定范围内,例如小于1000,则过滤器可能为:(1。“##、#、#、”)

hanhphuc 发表于 2022-7-5 23:46:29

你好,好主意,斯特凡。我在想(numberp(read str))如果使用(atof str),就可以去掉返回零的字母字符串
 
我认为零也可以忽略,因为它总是可以整除的?

Stefan BMR 发表于 2022-7-5 23:54:50

@hanhphuc公司
方括号匹配所包含的任何单个字符。
例如,##表示##0或##5。
换句话说,它意味着“任何正好包含3个字符的字符串,以任意2个数字字符开头,以0或5结尾”
页: [1]
查看完整版本: 可被整除的筛选文本值