Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Rund um AutoCAD
  Mit AutoLISP Eigenschaften von Linien in Blöcken ändern

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
Autor Thema:   Mit AutoLISP Eigenschaften von Linien in Blöcken ändern (1110 mal gelesen)
blauesglas
Mitglied


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

Beiträge: 3
Registriert: 06.09.2017

AutoCAD 2017; Win 7 Pro;
I7 2.8 GHz; 16 GB RAM

erstellt am: 06. Sep. 2017 11:53    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


ZIP-Markise.zip

 
Hallo zusammen,

ich habe ein Problem, dass ich gerne mit AutoLISP lösen möchte.
Leider fehlen mir dazu die richtigen Programmierkenntnisse.

Wir laden ab und zu Zeichnungen von einem Hersteller herunter (Quelle: www.sonnenschutzplaner.de). Ein Beispiel liegt im Anhang.
Die Zeichnungen sind in einer Blockstruktur abgelegt, die wir gerne behalten möchten.
Jedoch möchten wir die Linien in den untersten Blöcken in Ihren Eigenschaften ändern.

Primär geht es um die Farben der Linien. Diese sind in RGB-Code eingetragen und wir bräuchten die AutoCAD-Farbe
Bsp.: RGB 0,255,0  -->  Farbe Index "3 - Grün" in AutoCAD

Aber wenn man das über AutoLISP lösen kann, könnte man auch gleich die Layer und Linientypen auf unseren Standard mitändern.
Layer von "center" -> "AM_7"
Linientyp von "center" -> "VonLayer"


Im Internet habe ich schon einzelne Befehle im AutoLISP gefunden, aber mangels Programmierkenntnisse diese nicht miteinander kombinieren können.

Kann mir da bitte jemand helfen?

Vielen Dank!

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13413
Registriert: 30.11.2003

Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.

erstellt am: 06. Sep. 2017 12:41    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 blauesglas 10 Unities + Antwort hilfreich

Sowas wie "unterste Blöcke" gibt es nicht, eine Referenzen eines Blockes können Bestandteile anderer Blöcke oder der Layouts sein ...
In deinem Beispiel würde ich alle Blöcke mit ccLAB im Namen berücksichtigen ...

Da es viel mehr RGB als ACI Farben gibt  ...  und ihr alle sicher nicht per Zuweisungs-Tabelle Abdecken wollt, würde ich optisch ähnliche zuweise ... dafür gabs von mir schon mal das Programm COLORS2ACI (-> mal suchen)

Der Rest ist dann auch machbar. Aber alles kein 10-Zeiler.

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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

CADwiesel
Moderator
CAD4FM UG




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

Beiträge: 1896
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 06. Sep. 2017 13:33    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 blauesglas 10 Unities + Antwort hilfreich

ich hab dir mal 'n 17 Zeiler gemacht. Das ist aber schon Ende der Selbsthilfe. Nu musst du dich selber anstrengen
Code:
(defun c:RGB->ACI ( / BLOCK ITEM)
  (vl-load-com)
  (vlax-for BLOCK(vla-get-blocks(vla-get-activedocument
                                          (vlax-get-acad-object)
                                          ))
    (vlax-for ITEM BLOCK
      (if(and
          (vlax-property-available-p ITEM 'Truecolor)
          (=(vla-get-red (vla-get-Truecolor ITEM))0)
          (=(vla-get-green (vla-get-Truecolor ITEM))255)
          (=(vla-get-blue (vla-get-Truecolor ITEM))0)
          )
        (vl-catch-all-error-p
                  (vl-catch-all-apply
                    'vla-put-color (list ITEM 3))))))
  (vla-Regen (vla-get-activedocument (vlax-get-acad-object)):vlax-true)
  )

------------------
Gruß
CADwiesel
Besucht uns im CHAT

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: 19237
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 06. Sep. 2017 13: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 Nur für blauesglas 10 Unities + Antwort hilfreich

Hallo blauesglas und Willkommen auf CAD.de,

ich habe mir einmal die Mühe gemacht dieses Beispiel genau anzusehen,
was in diesem Fall recht aufwändig war.
Über 500 Blockreferenzen, insgesamt 30.000 Objekte, aber zum Glück nur 7 Layer + EinfügeLayer AM_0

Ich unterstelle jetzt einmal das dein Wunsch nicht zwingend so umgesetzt werden muß,
oder brauchst du wirklich eine Objektefarbe (ungleich VonLayer?)

Die Eigenschaften der Blockobjekte bzw. der Objekten in den Blöcken sind nämlich ganz penibel
IMMER GLEICH PRO LAYER.

Wenn in deinem weiteren Workaround nichts dagegen spricht könnte man also einfach alle
Objekteigenschaften auf VonLayer setzen und die Layer entsprechend einstellen und
wenn es denn sein muss - auch umbenennen.

Dann würde man alles auch mit einfachen vorhandenen AutoCAD-Befehlen umsetzen können,
also auch ohne extra Programm mit einfachem Macro oder Script arbeiten können.

Beispiel nach Großmutternart:

MakroAnfang, dann muß noch die Layergeschichte dazugebastelt werden.
^C^C_SETBYLAYERMODE;255;_SETBYLAYER;_all;;_yes;_yes;(alert"usw.")

Auch die Layer umbenennen geht, über den AutoCAD-Befehl UMBENENN
Für den Fall das ein Layer-Mischen benötigt wird: LAYZUSF

Diese Standard Variablen und Befehle sind alle in der Hilfe enthalten
und können direkt in der befehlszeile per Hand durchgetestet werden,
nur werden diese sehr oft über einen Mausklick aufgerufen.

einfach mal für die Befehlszeile copy&paste:
;=================================================
SETBYLAYERMODE
255
SETBYLAYER
ALLE

JA
JA
-LAYER
FARBE 6 HIDDEN
FARBE 1 DIMENSION_LINE,THIN_LINE
FARBE 3 CENTER
FARBE 5 THICK_DASH_DOTTED
FARBE 7 THICK_LINE,DIMENSION_TEXT

-UMBENENN LAYER
"center"
"AM_7"

;=================================================

Für die Layergeschichte kann man aber auch gut Befehl LAYKONF einsetzen,
also einfach Setbylayer und danach LayKonf mit einer vordefinierten Übersetzungsliste, fertig.

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

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

blauesglas
Mitglied


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

Beiträge: 3
Registriert: 06.09.2017

AutoCAD 2017; Win 7 Pro;
I7 2.8 GHz; 16 GB RAM

erstellt am: 07. Sep. 2017 08:49    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,

schon mal vielen Dank für die Rückmeldungen!

Der Wunsch die Farben zu ändern liegt daran, dass beim Plotten unsere Plotstiltabelle nur die AutoCAD-Farben akzeptiert.


@CADwiesel: Das Programm löst das Problem mit den Farben genau so wie ich mir das vorgestellt habe. Es zu erweitern stellte für mich kein Problem mehr da. Vielen Dank dafür!


Zum Vorschlag von cadffm:
Es wäre als Alternative auch sinnvoll Farbe/Linienstil etc. auf "VonLayer" einzustellen.
Ich habe nur das Problem, wenn ich die Zeichnung in meine Zeichnung einfüge, kann ich die Layer z.B. "center" -> "AM_7" nicht mehr umbenennen, da diese bereits vorhanden sind und benutzt werden.

Wenn ich jetzt die Objekte von einem zum anderen Layer legen wollte, nehme ich ja von Hand die Schnellauswahl und ändere dann die Eigenschaften.
Lässt sich dieser Ablauf auch automatisieren? Auf meiner gestrigen Suche wurde ich nicht direkt fündig. Ich finde immer nur die Befehle die Schnellauswahl aufzurufen.

Wenn das noch geht, wäre es für mein Problem die Kirsche auf der Sahnetorte. Das Grundproblem mit den Farben ist ja bereits gelöst worden.

Danke!

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: 19237
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 07. Sep. 2017 09:01    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 blauesglas 10 Unities + Antwort hilfreich

Die AutoCAD-Objektwahl findest du in Lisp als SSGET,
also drücke [F1] und suche nach ssget. Millionen Beispiele dazu im Netz, auch hier im Forum, in jedem dritten Code.
Und wenn du selbst noch keine Eigenschaften-Ändern-Routinen schreiben kannst, nehme für "TopLevel" Objekte einfach den AutoCAD-Befehl: EIGÄNDR oder ÄNDERN

EDIT, da dies möglicherweise falsch aufgefasst werden konnte:
"nehme für "TopLevel" Objekte einfach den AutoCAD-Befehl: EIGÄNDR oder ÄNDERN"
Diese kann man natürlich auch in Lisp automatisch an die Befehlszeile senden:
(Command "EIGÄND" SS1 "" "LAYER" usw......) der Befehlsablauf ist in der befehlszeile schnell zu ermitteln,
einfach den Befehl eingeben und den Ablauf mitschreiben.[/ EDIT]

AutoCAD-Befehle:
Wenn du nicht vorher in einer isolierten Datei die Layer umbenennst,
dann hast du später ein Problem da der Ziellayer schon existiert, aha.

Zitat:
Original erstellt von cadffm:
Auch die Layer umbenennen geht, über den AutoCAD-Befehl UMBENENN
Für den Fall das ein Layer-Mischen benötigt wird: LAYZUSF

   


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

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

blauesglas
Mitglied


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

Beiträge: 3
Registriert: 06.09.2017

AutoCAD 2017; Win 7 Pro;
I7 2.8 GHz; 16 GB RAM

erstellt am: 11. Sep. 2017 13:37    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 nochmal,

ich habe nochmal  mit dem Code von CADwiesel gespielt und probiert, aber mit der Syntax habe ich noch meine Probleme:
Ziel war ja, dass alle Objekte, die Truecolor haben, andere Eigenschaften bekommen. Durch den Code bearbeitet er jedoch alle anderen Objekte, die dem Suchkriterium nicht entsprechen, auch auf "VonLayer". 

Kann bitte jemand die Syntax kontrollieren? Habe letzte Woche diverse Varianten probiert, aber das Verschachteln der Befehle bereitet mir heute schon wieder Kopfschmerzen...

Gerne hätte ich die Variante "Befehle von Hand aufschreiben und eintippen" genommen, jedoch durch die zu erhaltene Blockstruktur muss ich so eine Iteration verwenden, oder?


(defun c:SSP-bereinigen ( / BLOCK ITEM)
  (vl-load-com)
  (vlax-for BLOCK ;Iteration jeder Block
    (vla-get-blocks ;Block "aktivieren"
  (vla-get-activedocument ;im aktiven Dokument
        (vlax-get-acad-object) ;alle AutoCAD-Elemente
      )
  )
    (vlax-for ITEM BLOCK ;Iteration jedes Objekt im Block
  (if(and
(vlax-property-available-p ITEM 'Truecolor)
(=(vla-get-red (vla-get-Truecolor ITEM))0)
(=(vla-get-green (vla-get-Truecolor ITEM))255)
(=(vla-get-blue (vla-get-Truecolor ITEM))0)
(vlax-get-property ITEM 'Layer)
(="center")
) ;nur Objekte mit Eigenschaften Farbe 0,255,0 und Layer "center" markieren
(vl-catch-all-error-p
  (vl-catch-all-apply
  '(vla-put-color (list ITEM 256)) ; Farbe ändern in "VonLayer"
  '(vlax-put-property _obj 'Layer "AM_7")
  '(vlax-put-property _obj 'LineType "VonLayer")  ;hier jetzt Befehle zum Ändern der Eigenschaften generell
  )
)
  )

  (if(and
(vlax-property-available-p ITEM 'Truecolor)
(=(vla-get-red (vla-get-Truecolor ITEM))255)
(=(vla-get-green (vla-get-Truecolor ITEM))0)
(=(vla-get-blue (vla-get-Truecolor ITEM))0)
(vlax-get-property ITEM 'Layer)
(="dimension_line")
) ;nur Objekte mit Eigenschaften Farbe 0,255,0 und Layer "dimension_line" markieren
(vl-catch-all-error-p
  (vl-catch-all-apply
'(vla-put-color (list ITEM 256)) ; Farbe ändern in "VonLayer"
'(vlax-put-property _obj 'Layer "AM_5")
'(vlax-put-property _obj 'LineType "VonLayer")  ;hier jetzt Befehle zum Ändern der Eigenschaften generell
  )
)
  )
)

  )
  (vla-Regen (vla-get-activedocument (vlax-get-acad-object)):vlax-true) ;Regenerieren der gesamten Zeichnung
 
  (princ "Programm ist fertig!") ; Fertigmeldung
 
)

Vielen Dank für den hoffentlich diesen letzten Hinweis 

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)2019 CAD.de | Impressum | Datenschutz