Изменить сущность DXF в определенном индексе в AutoLISP - PullRequest
0 голосов
/ 19 сентября 2018

Я борюсь с изменением правильного 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))

Здесь я хочу изменить DXF 300 с индексом 4 (300. "E-01")

Я создал следующий код: Но как я могу выбрать индекс?и получить 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 голосов
/ 19 сентября 2018

Что касается вашей проблемы, у меня есть сомнения по поводу обновления ассоциативного списка на основе индекса, потому что иногда мы не можем предсказать точную позицию индекса.пожалуйста, проверьте возможность изменения индекса.

Здесь я пишу две функции, которые могут помочь изменить ассоциативный список.
1. Обновить ассоциативный список на основе Index.
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)


)


Надеюсь, это поможет.

0 голосов
/ 19 сентября 2018

Попробуйте:

(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 )

тогда конечно endmod, entupd

...