在AutoLISP中的特定索引中更改DXF实体

时间:2018-09-19 07:34:23

标签: autocad-plugin autolisp

我正在努力更改正确的DXF,因为9 DXF为300。

我使用命令(entget(car(entsel)))获得以下列表:

((-1 . <Entity name: 223791faf20>)
(0 . "HSB_BEAMENT")
(330 . <Entity name: 21b6fa889f0>) 
(5 . "5A612") 
(100 . "AcDbEntity") 
(67 . 0) 
(410 . "Model") 
(8 . "E-01") 
(62 . 92) 
(100 . "Hsb_BeamEnt") 
(70 . 3) 
(10 -86756.4 43492.7 3022.5) 
(15 -86756.4 43492.7 530.094) 
(142 . 5469.91) 
(143 . -485.094) 
(11 0.0 0.0 1.0) 
(12 -1.83697e-16 -1.0 0.0) 
(13 1.0 -1.83697e-16 0.0) 
(14 0.0 0.0 0.0) 
(140 . 45.0) 
(141 . 295.0) 
(300 . "") 
(70 . 10) 
(79 . 0) 
(332 . <Entity name: 0>) 
(144 . 0.0) 
(300 . "STUTZ") 
(300 . "Bearbejdet") 
(300 . "490") 
(300 . "E-01") 
(300 . "") 
(300 . "") 
(300 . "Ribbe C24 295x45") 
(300 . "C24") 
(301 . "") 
(302 . "") 
(71 . -1) 
(72 . 0) 
(73 . 0) 
(74 . 6))

在这里,我想更改索引4(300。“ E-01”)上的DXF 300

我创建了以下代码:但是如何选择索引?并获得我想要的DXF。

(defun c:changeattr()
    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))

    (setq c (subst (cons 300 "F200") (assoc 300 b) b))  ; Trying to update and change the Label Property
    (entmod c)
    (entupd a)
    (prompt "\nAttribute entity updated.")
(princ)
)

高级帮助。我很感激:)

2 个答案:

答案 0 :(得分:1)

尝试一下:

(setq def (entget (car(entsel ))) )

(defun DXF:Put ( def code index val / subs cp
    *error* )   (defun *error* ( msg / ) 
        (if (not (null msg ) )  (progn (princ "\nDXF:Pu:*error*: " ) (princ msg ) (princ "\n")  ) )
    )
    (setq cp def )
    ( while (setq item (assoc code cp ))
        (setq subs (append subs (list item ) ) )
        (setq cp (cdr (member item cp ) ))
    )
    (subst (cons code val) (nth index subs ) def )
)

(setq code 300 
    index 4
    val "test"
)


(DXF:Put def code index val )

然后当然是endmodentupd

答案 1 :(得分:1)

根据您在这里的问题,我怀疑是否要根据索引更新关联列表,因为有时我们无法预测确切的索引位置。请检查索引更改的可能性。

在这里,我写了两个有助于更改关联列表的函数。
1.根据索引更新关联列表。
2.在OldValue的基础上更新关联列表。

此功能包含在您的代码中,如下所示。

(defun c:changeattr()

;------------------------------------------New Function To change associate list---------------------------------------------;

;This function Update Associative list by index
;[ key ]-> Key Value in associate list
;[ NewValue ]-> New Value to replace
;[ index ]-> Index
;[ InputList ]-> Associate List  

(defun UpdateAssocListByIndex(key NewValue index InputList / index)

;set index value to 1 if input is nil or empty string
;Change on 21-09-218 By Dinesh Pawar to remove bug if index input is nil or blank string 
;(setq index (if (or (= nil index) (= "" index) ) 0 index))--Before 21-09-2018
(setq index (if (or (= nil index) (= "" index) ) 1 index));change 0-1    
(mapcar '(lambda (x)
       (if (= (car x) key);check if current key is equal to inout key
         (if (= index 1)
           (setq index (- index 1)
         x (cons key NewValue));if index zero then add list with new value and lower index

           (setq index (- index 1); lower index
             x     x ;this act as output to lambda function
           )
         )
         x;ouput to lambda
       )
     );Lambda end here

    InputList ; input list to run lambda loop for each element in InputList
)

)


;This function update List by Old Key value.
;[ key ]-> Key Value in associate list
;[ NewValue ]-> New Value to replace
;[ OldKeyValue ]-> Old Value
;[ InputList ]-> Associate List  

(defun UpdateAssocListBykeyValue (key NewValue OldKeyValue InputList / index)
(subst (cons key NewValue) (cons key OldKeyValue)   InputList) 
)

;-------------------------------------Your Code ----------------------------------------------------------------------------;

    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))
    ;(UpdateAssocListByIndex key NewValue index InputList)
    (setq c (UpdateAssocListByIndex 300 "F200" 4 b));see modification.
    ;(setq c (subst (cons 300 "F200") (assoc 300 b) b))  ; Trying to update and change the Label Property
    (entmod c)
    (entupd a)
    (prompt "\nAttribute entity updated.")
(princ)


)


希望对您有帮助。