Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  GETINSERTSBY-VALUES erweitern

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  GETINSERTSBY-VALUES erweitern (611 mal gelesen)
silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 88
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 09. Dez. 2015 08:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,
ich bräuchte mal wieder einen kleinen Anschubs.
Habe vor längerer Zeit hier mal die LISP (GETINSERTSBY-VALUES) gefunden.
Total genial!
Wenn ich es laufen lasse, gebe ich einen String ein. Danach wird entweder nach Attributname oder -wert gesucht und alle übereinstimmenden Blöcke werden selektiert.
Jetzt würde ich gerne dies einwenig erweitern.
Nachdem die Blöcke selektiert sind, würde ich gerne diese sprengen (_explode). Leider fehlt mir vollkommen der Ansatz

Vllt hat einer von euch Guru's einen Ansatz für mich
Im Voraus schon mal besten Dank!

Und hier nun der CODE:

Code:
(vl-load-com)
(defun C:GETINSERTSBY-VALUE (/ QUESTION SEARCHSTRING WHAT?)
(sssetfirst)
(if (not $$GLOBAL-LAST-SEARCHSTRING)
(setq QUESTION
"\nBitte Such-Text eingeben (wcmatch-Wildcards zulässig): "
)
(setq QUESTION
(strcat
"\nBitte Such-Text eingeben (wcmatch-Wildcards zulässig) <"
$$GLOBAL-LAST-SEARCHSTRING
">: "
)
)
)
(setq SEARCHSTRING (getstring 't QUESTION))
(cond
((and (equal SEARCHSTRING "") $$GLOBAL-LAST-SEARCHSTRING)
(setq SEARCHSTRING $$GLOBAL-LAST-SEARCHSTRING)
)
((not (equal SEARCHSTRING ""))
(setq $$GLOBAL-LAST-SEARCHSTRING SEARCHSTRING)
)
('t (setq $$GLOBAL-LAST-SEARCHSTRING NIL))
)
(if (not $$GLOBAL-LAST-SEARCHSTRING)
(princ "\nKein Such-Text eingegeben, Funktionsende.")
(progn
(initget "Attributname attributWert")
(if (not (setq WHAT?
(getkword
"\nIn welchem Bereich soll der String gesucht werden? [Attributname/attributWert] <attributWert>: "
)
)
)
(setq WHAT? "attributWert")
)
(if (equal WHAT? "Attributname")
(setq WHAT? (DT:OBJECTLIST->SELSET
(FINDBLOCKSWITHATTDEFLIKE
(list $$GLOBAL-LAST-SEARCHSTRING)
)
)
)
(setq WHAT? (DT:OBJECTLIST->SELSET
(FINDBLOCKSWITHATTVALLIKE
(list $$GLOBAL-LAST-SEARCHSTRING)
)
)
)
)
(if WHAT?
(progn
(sssetfirst WHAT? WHAT?)
(princ "\nOK, gefundene Inserts markiert...")
)
(princ "\nKEINE Inserts für Such-Text gefunden...")
)
)
)
(princ)
)

;;; Findet Blöcke im aktuellen Bereich, deren Attributdefinitionen einen bestimmten Namen haben
(defun FINDBLOCKSWITHATTDEFLIKE (LISTOFATTNAMES /)
(FINDBLOCKSWITH-BASE LISTOFATTNAMES 'car)
)

(defun FINDBLOCKSWITHATTVALLIKE (LISTOFVALUES /)
(FINDBLOCKSWITH-BASE LISTOFVALUES 'cdr)
)

;; Findet Strings in Inserts (wcmatch-like)
;; Verwendet die Liste die Funktion "ALL-BL-TXT"
;; zurückgibt -> '(("ATTNAME" . "ATTVALUE")(...))
;; SYMBOL gibt an, was denn nun relevant ist,
;; das 'car oder das 'cdr des punktierten Paares
(defun FINDBLOCKSWITH-BASE (LISTOFSTRINGS SYMBOL /)
(setq VGLSTR (MS_STRDELIMITED LISTOFSTRINGS ","))
(if (setq
SGET (ssget "x"
(list (cons 0 "Insert") (cons 410 (getvar "ctab")))
) ;_ end of ssget
) ;_ end of setq
(if (setq SGET (DT:SELSET->VLA-OBJECTLIST SGET))
(if (setq SGET
(vl-remove-if-not
(function
(lambda (X)
(= (VLAX*GET-PROPERTY X 'HASATTRIBUTES) :vlax-true)
) ;_ end of lambda
) ;_ end of function
SGET
) ;_ end of VL-REMOVE-IF-not
) ;_ end of setq
(progn
(setq SGET
(mapcar
(function
(lambda (X) (list X (mapcar SYMBOL (ALL-BL-TXT X))))
) ;_ end of function
SGET
) ;_ end of mapcar
) ;_ end of setq
(if (setq SGET
(vl-remove-if-not
(function
(lambda (X)
(vl-member-if
(function (lambda (Y) (wcmatch Y VGLSTR)))
(cadr X)
) ;_ end of vl-member-if
) ;_ end of lambda
) ;_ end of function
SGET
) ;_ end of vl-remove-if-not
) ;_ end of setq
(setq SGET (mapcar 'car SGET))
(setq SGET NIL)
) ;_ end of if
) ;_ end of progn
) ;_ end of if
) ;_ end of if
) ;_ end of if
SGET
)

(defun MS_STRDELIMITED (LST TOKEN /)
(vl-string-right-trim
TOKEN
(apply 'strcat
(mapcar '(lambda (X) (strcat X TOKEN)) LST)
) ;_ end of apply
) ;_ end of vl-string-right-trim
)

(defun DT:SELSET->VLA-OBJECTLIST (SELSET / RETVAL)
(if (eq (type SELSET) 'PICKSET)
(if (setq RETVAL (DT:SELSET->ENAMELIST SELSET))
(setq RETVAL
(mapcar (function (lambda (X) (->VLA-OBJECT X))) RETVAL)
) ;_ end of setq
) ;_ end of if
) ;_ end of if
RETVAL
)

;;; z.B. (DT:SELSET-LIKE-DEFINITION (list (cons 0 "IMAGE")(cons 8 "*$BILD$@*")))
(defun DT:SELSET->ENAMELIST (SELSET / INDEX RETVAL)
(if (eq (type SELSET) 'PICKSET)
(progn
(setq INDEX 0)
(repeat (sslength SELSET)
(setq RETVAL (cons (ssname SELSET INDEX) RETVAL)
INDEX (1+ INDEX)
) ;_ end of setq
) ;_ end of repeat
) ;_ end of progn
) ;_ end of if
retval
) ;_ end of defun

(defun DT:OBJECTLIST->SELSET (OBJECTLIST / SGET)
(gc)
(if (setq OBJECTLIST
(vl-remove-if
'null
(mapcar (function (lambda (X) (->ENAME X)))
OBJECTLIST
)
)
)
(progn
(setq SGET (ssadd))
(foreach ELEM OBJECTLIST
(setq SGET (ssadd ELEM SGET))
)
)
)
(if SGET
(if (> (sslength SGET) 0)
SGET
)
)
)

;;; Funktion gibt vla-Objekt zurück, wenn Lisp-Objekt oder vla-Objekt
;;; übergeben worden sind. Ansonsten nil
(defun ->VLA-OBJECT (ENAME /)
(cond
((= (type ENAME) 'ENAME) (vlax-ename->vla-object ENAME))
((= (type ENAME) 'VLA-OBJECT) ENAME)
(t NIL)
) ;_ end of cond
) ;_ end of defun

;;; Funktion gibt Ename zurück, wenn Lisp-Objekt oder vla-Objekt
;;; übergeben worden sind. Ansonsten nil
(defun ->ENAME (ENAME /)
(cond
((= (type ENAME) 'VLA-OBJECT) (vlax-vla-object->ename ENAME))
((= (type ENAME) 'ENAME) ENAME)
(t NIL)
) ;_ end of cond
) ;_ end of defun


;;; Mapcar-Magie!
;;; Eigenschaftswerte aus Objekten lesen
;;; Beispiel:
;;; Layerfarbe des aktuellen Layers abfragen:
;;; (vlax*get-property nil '(Color ActiveLayer ActiveDocument))
;;;
;;; Abfragen, ob eine Polylinie geschlossen ist:
;;; (VLAX*GET-PROPERTY (vlax-ename->vla-object (car (entsel))) 'CLOSED)
(defun VLAX*GET-PROPERTY (OBJ PROPS /)
(if (->VLA-OBJECT OBJ) ;_ Wenn vla-Objekt draus gemacht werden kann...
(setq OBJ (->VLA-OBJECT OBJ)) ;_ mache auf jeden Fall eines draus
) ;_ end of if
(if (null OBJ)
(setq OBJ (vlax-get-acad-object))
) ;_ end of if
(if (and (listp PROPS) (cdr PROPS))
(vlax-get-property
(VLAX*GET-PROPERTY OBJ (cdr PROPS))
(car PROPS)
) ;_ end of vlax-get-property
(vlax-get-property
OBJ
(if (listp PROPS)
(car PROPS)
PROPS
) ;_ end of if
) ;_ end of vlax-get-property
) ;_ end of if
) ;_ end of defun

;;; Funktion durchsucht den Block, der über ename übergeben wird,
;;; nach ATTRIB's und erzeugt 'ne Textliste
;;; Retval: Liste der Texte oder nil
;; Hier vl-Version
(defun ALL-BL-TXT (ENAME / EDATA RETVAL ATTS)
(setq ENAME (->VLA-OBJECT ENAME)
RETVAL '() ;_ Liste initialiseren
) ;_ end setq
(if (= (VLAX*GET-PROPERTY ENAME 'HASATTRIBUTES) :vlax-true)
(progn
(setq ATTS (vlax-safearray->list
(vlax-variant-value
(vlax-invoke-method ENAME 'GETATTRIBUTES)
) ;_ end of vlax-variant-value
) ;_ end of vlax-safearray->list
) ;_ end of setq
(while ATTS
(setq RETVAL
(cons (cons
(VLAX*GET-PROPERTY (car ATTS) 'TAGSTRING)
(VLAX*GET-PROPERTY (car ATTS) 'TEXTSTRING)
) ;_ end of cons
RETVAL
) ;_ end of cons
) ;_ end of setq
(setq ATTS (cdr ATTS))
) ;_ end of while
(setq RETVAL (reverse RETVAL))
) ;_ end progn
) ;_ end if
RETVAL
)


Viele Grüße
silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 09. Dez. 2015 08:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für silcono 10 Unities + Antwort hilfreich

Link zur Quelle:
http://ww3.cad.de/foren/ubb/Forum54/HTML/009027.shtml#000002

Hallo silcono,

drücke einfach auf Ursprung und dann ist gut.

Im Ernst: Entweder du kannst es nicht und nutzt deine Möglichkeiten (Knopf drücken),
oder du arbeitest dich in die Thematik ein und löst deine Problem (Suchfunktion/Internet?).
(Ja, ich bin vermutlich mit dem falschen Fuß aufgestanden)

Einfachster Ansatz:
Der Befehl funktioniert bei einer Automatisierung nicht so wie "von Hand", also ist da etwas mehr nötig,
die Aufgabe "Auswahlsatz sprengen" ist aber weit verbreitet und somit gibt es fertigen Code.
Googlesuche im CAD.de-Lispforum: site:cad.de Forum145 auswahlsatz explode
Beispieltreffer: http://ww3.cad.de/foren/ubb/Forum145/HTML/002604.shtml

Und vielleicht noch die Info das man mit (ssget "_i") einen Auswahlsatz aus den aktuell markierten Objekten erstellen kann.

------------------
CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 88
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 09. Dez. 2015 08:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Morgen cadffm,

shame on me...
da waren wohl meine Gedanken komplett quer gelegen.

Ich danke dir für die Zurechtbiegung
An so einfach Sachen, habe ich nicht gedacht
Klappt alles Perfekt jetzt!

SORRY!

Viele Grüße
Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz