FastFiber

macro's of soorgelijke functie

Gestart door peter smith, di 10 03 2015, 23:22:43

Vorige topic - Volgende topic

peter smith

best allen,

Ik krijg regelmatig geconverteerde dwg-tekeningen van de onderaannemers die eerst door mij opgemaakt moeten worden, voordat ik verder aan de slag kan. Deze opmaak is vaak dezelfde handelingen.

1. qselect op "multilines" en color op "green", en veranderen dan deze selectie op layer "0" en color "252"
2. "find" de tekst "concrete" en op "create selection all" en op "replace" drukken

Zo zijn er meerdere van deze handelingen.

Mijn vraag is:
Hoe kan ik deze (2) handelingen dmv een knop of macro uitvoeren? Het kan mij veel tijd schelen, als ik deze handelingen in een keer kan (door een knop) kan uitvoeren?

Groeten,
peter smith

hulpje

Met macro's kun je veel bereiken, ik weet alleen niet zeker of het mogelijk is om iets met FIND te doen.
Waar je ook eens naar kunt kijken is de action recorder van AutoCAD.
Deze kun je vinden in het Pulldown menu Tools.
HELAAS BESTAAT CADToppers.com niet meer
ACP-er (AutoDesk Certified Professional)

EddyBeerke

Ja, je kunt het met macro's doen of met lisp.
Vereist wel programmeer ervaring.
Kijk eens verder op de site want de oplossing voor tekst vinden en vervangen staat wel ergens.
Volgens mij heeft HofCAD een keer iets gemaakt.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

Reimer

Autodesk heeft in het verleden de Action Recorder ontwikkeld. Hiermee kun je een serie commando's opnemen en later weer afspelen. Nadeel hierbij is dat je niet met dialoogvensters kunt werken. Alles moet via de commandoregel.
Voordeel is dat je met één knop meerdere handelingen achter elkaar kunt laten uitvoeren.

Helaas werkt het bij mij in R2012 niet goed merk ik net. Bij het opnemen worden de commando's niet geregistreerd maar de selectie wel. (bij het afspelen krijg ik enkel de melding: _Last Unknown command "LAST".)

Reimer

sschevers

Peter,

Als het om meerdere tekeningen gaat kun eens kijken of je uit de voeten kunt met ScriptPro 2.0. Dit is een tool van Autodesk waarmee je batchmatig scripts op tekeningen kan laten uitvoeren. Zie bijgaande link om te downloaden http://autodesk.blogs.com/between_the_lines/2012/06/scriptpro-for-autocad-32bit-and-64bit.html en deze link voor een korte uitleg over hoe je het kan gebruiken https://aectechtalk.wordpress.com/2012/10/27/batch-process-drawings-with-scriptpro/

groeten

stephan

peter smith

Ik heb een aantal verschillende pogingen geprobeerd. Het werkt idd niet met de dialogbox. De specifieke kenmerken worden niet opgeslagen in de macro's.
find and replace werkt ook helaas via de dialogbox. Het valt toch tegen om met macro's te werken.


EddyBeerke

Voor de tekst kun je dit gebruiken:
;-============-;
;- Text  Find -;
;-    *~*     -;
;  Written by -;
; Mark Mercier ;
;   05-06-09   ;
;-============-;

; Improvements:
; Text within blocks
; Improved selection set.. maybe do away with the whole "list" thing and go straight VLA

(defun c:tfind()
  (tfindfun nil nil 0)
  )

(defun tfindfun(inputF inputR caseSn / goto goWhile strinF strinR selSet selTxt searep case count error)
  ; 01 Create selection set. GOTO 02 if success, or GOTO 08 if fail
  ; 02 Check passed input. If both nil, GOTO 03. If first string and second nil, GOTO 06. If both strings, GOTO 07. Otherwise, return error and GOTO 08
  ; 03 Display menus and obtain data from user. If Search, GOTO 04. If Replace, GOTO 05
  ; 04 Search option selected. Prompt user for single search term. GOTO 06
  ; 05 Replace option selected. Prompt user for search term and replace term. GOTO 07
  ; 06 One string has been passed. Assume automatic search. Run same as current (tfind). GOTO FINISH
  ; 07 Two strings have been passed. Assume automatic replace. Pass both strings to (replace) function. GOTO FINISH
  ; 08 FINISH. Return errors if needed. End loop and program.
  (vl-load-com)
  (setq goTo 1)
  (setq goWhile 1)
  (setq count 0)
  (if (not (mlml (list caseSn) (list 0 1))) (progn (setq goWhile nil) (princ "\nCase selection not recognized.")))
  (if (= caseSn 0) (setq case "N") (setq case "Y"))
  (while goWhile
    (cond
      ((= goTo 1)
       (setq selSet (extTxtPt (ssget "_X" (list (cons -4 "<OR") (cons 0 "TEXT,MTEXT") (cons -4 "<AND") (cons 0 "INSERT") (cons 66 1) (cons -4 "AND>") (cons -4 "OR>")))))
       (if selSet (setq goTo 2) (setq error "\nSelection set not found." goTo 8))
       )
      ((= goTo 2)
       ; Check input, pass to whatever.
       (cond
     ((and (= inputF nil) (= inputR nil))
      (setq goTo 3)
      )
     ((and (= (type inputF) 'STR) (= inputR nil))
      (setq strinF inputF)
      (setq goTo 6)
      )
     ((and (= (type inputF) 'STR) (= (type inputR) 'STR))
      (setq strinF inputF)
      (setq strinR inputR)
      (setq goTo 7)
      )
     (t
      (setq error "\nPassed arguments are not accepted.")
      (setq goTo 8)
      )
     )
       )
      ((= goTo 3)
       ; Obtain desired option from user
       (while (not (mlml (list (setq searep (strcase (getstring nil "\nSelect option [Find/Replace/Quit/Case]: "))))
                 (list "F" "FIND" "R" "REPLACE" "Q" "QUIT" "C" "CASE")
                 ))
     )
       (cond
     ((mlml (list searep) (list "F" "FIND"))
      (setq goTo 4)
      )
     ((mlml (list searep) (list "R" "REPLACE"))
      (setq goTo 5)
      )
     ((mlml (list searep) (list "Q" "QUIT"))
      (setq goTo 8)
      )
     ((mlml (list searep) (list "C" "CASE"))
      (while (not (mlml (list (setq case (strcase (getstring nil "\nCase sensitive? [Yes/No]: "))))
                    (list "Y" "YES" "N" "NO")
                    ))
        )
      )
     )
       )
      ((= goTo 4)
       ; Obtain search string from user, set to strinF
       (while (eq "" (setq strinF (getstring T "\nEnter search term: "))))
       (setq goTo 6)
       )
      ((= goTo 5)
       ; Obtain search string and replace string from user, set to strinF and strinR respectively
       (while (eq "" (setq strinF (getstring T "\nEnter find term: "))))
       (while (eq "" (setq strinR (getstring T "\nEnter replace term: "))))
       (setq goTo 7)
       )
      ((= goTo 6)
       ; Search drawing for strinF
       (cond
     ((mlml (list case) (list "Y" "YES"))
      ; Compare using (vl-string-search strinF input), view selection
      ; use "while" to get all search occurances
      (foreach selVar selSet
        (if (vl-string-search strinF (nth 0 selVar))
          (progn
        (setq count (1+ count))
        (if (/= (getvar "ctab") (caddr selVar)) (command "ctab" (caddr selVar)))
        (command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar)))
        (getstring "\nPress 'Enter' to continue: ")
        )
          )
        )
      )
     ((mlml (list case) (list "N" "NO"))
      ; Compare using (vl-string-search (strcase strinF) (strcase input)), view selection
      ; use "while" to get all search occurances
      (foreach selVar selSet
        (if (vl-string-search (strcase strinF) (strcase (nth 0 selVar)))
          (progn
        (setq count (1+ count))
        (if (/= (getvar "ctab") (caddr selVar)) (command "ctab" (caddr selVar)))
        (command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar)))
        (getstring "\nPress 'Enter' to continue: ")
        )
          )
        )
      )
     )
       (if (= count 0) (setq error "\nNo matches found.") (setq error (strcat (itoa count) " matches found.")))
       (setq goTo 8)
       )
      ((= goTo 7)
       ; Replace strinF with strinR
       (cond
     ((mlml (list case) (list "Y" "YES"))
      ; Compare using (vl-search-string strinF input), modify using (vl-string-subst) within a while loop
      (foreach selVar selSet
        (setq selTxt (nth 0 selVar))
        (setq seaLoc 0)
        (while (setq seaLoc (vl-string-search strinF selTxt seaLoc))
          (setq selTxt (vl-string-subst strinR strinF selTxt seaLoc))
          (setq seaLoc (+ seaLoc (strlen strinR)))
          (setq count (1+ count))
          )
        (vla-put-TextString (vlax-ename->vla-object (nth 4 selVar)) selTxt)
        )
      )
     ((mlml (list case) (list "N" "NO"))
      ; Compare using (vl-string-search (strcase strinF) (strcase input)), modify using (vl-string-subst) within a while loop
      (foreach selVar selSet
        (setq selTxt (nth 0 selVar))
        (setq seaLoc 0)
        (while (setq seaLoc (vl-string-search (strcase strinF) (strcase selTxt) seaLoc))
          (setq selTxt (strcat (substr selTxt 1 seaLoc) strinR (substr selTxt (+ 1 seaLoc (strlen strinF)))))
          (setq seaLoc (+ seaLoc (strlen strinR)))
          (setq count (1+ count))
          )
        (vla-put-TextString (vlax-ename->vla-object (nth 4 selVar)) selTxt)
        )
      )
     )
       (if (= count 0) (setq error "\nNo occurances found.") (setq error (strcat (itoa count) " occurances modified.")))
       (setq goTo 8)
       )
      ((= goTo 8)
       (if error (princ error))
       (setq goWhile nil)
       )
      )
    )
  (princ)
  )

(defun mlml(inSMLChar inSMLStri / returnVarMS toCheck chkWith)
  (setq returnVarMS nil)
  (if (and (= (type inSMLChar) 'LIST)
       (= (type inSMLStri) 'LIST)
       )
    (progn
      (foreach toCheck inSMLStri
    (foreach chkWith inSMLChar
      (if (eq toCheck chkWith) (setq returnVarMS T))
      )
    )
      );/progn
    )
  returnVarMS
  ); Checks a list to see if a member of that list is the same as a member of another list. Returns T or nil

(defun extTxtPt(ssList / subVar getEnt entTyp entTxt entPnt entLay entHgt grp66 entAtt getEntAtt entAttTyp uniLst)
  (setq uniLst nil)
  (setq subVar 0)
  (if ssList
  (repeat (sslength ssList)
    (setq getEnt (entget (cadr (car (ssnamex ssList subVar)))))
    (setq entTyp (cdr (assoc 0 getEnt)))
    (cond
      ((or (= entTyp "TEXT") (= entTyp "MTEXT"))
       (setq entTxt (cdr (assoc 1 getEnt)))
       (setq entPnt (cdr (assoc 10 getEnt)))
       (setq entHgt (cdr (assoc 40 getEnt)))
       (setq entLay (cdr (assoc 410 getEnt)))
       (setq entNam (cdr (assoc -1 getEnt)))

       (setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam))))
       )
      ((= entTyp "INSERT")
       (setq grp66 (assoc 66 getEnt))
       (if grp66
     (progn
       (setq entAtt (entnext (cdr (assoc -1 getEnt))))
           (setq getEntAtt (entget entAtt))
           (setq entAttTyp (cdr (assoc 0 getEntAtt)))
       )
     )
       (while (= entAttTyp "ATTRIB")
     (setq entTxt (cdr (assoc 1 getEntAtt)))
     (setq entPnt (cdr (assoc 10 getEntAtt)))
         (setq entHgt (cdr (assoc 40 getEntAtt)))
     (setq entLay (cdr (assoc 410 getEntAtt)))
     (setq entNam (cdr (assoc -1 getEntAtt)))
     
     (setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam))))

     ; Get next entity.
     (setq entAtt (entnext (cdr (assoc -1 getEntAtt))))

     ; Get ent and ent type
     (setq getEntAtt (entget entAtt))
     (setq entAttTyp (cdr (assoc 0 getEntAtt)))
     )
       )
      (t
       )
      )
    (setq subVar (1+ subVar))
    )
    )
  uniLst
  ); Return list of all text-based objects (Text, MText, Attribute) in the current drawing
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/