Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Text kopieren und hochzählen

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:  Text kopieren und hochzählen (3315 mal gelesen)
Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 27. Mai. 2007 01:38    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,

ich habe folgendes Problem. Ich möchte einen Text kopieren und dabei hochzählen lassen. Das Lisp dazu habe ich soweit fertig und es funktioniert. Ich weiss, dass es hier im Forum schon etliche Threads dazu gibt, nichtsdestotrotz möchte ich eigentlich gerne meinen eigenes programm dazu haben. Da ich beim kopieren gerne die Ziffer am Zeiger hängend haben möchte kommt quasi nur der Orignal "_copy"-Befehl von autocad in frage. Nun habe ich ein Problem mit der Schleife. Ich habe mir schon den Kopf zermattert wie ich eine Schleife programmiere wenn ich im "copy"-Befehl keinen zweiten Punkt anklicke sondern eben nur auf Return (so wie man in der Regel im normalen AutoCAD den Mehrfachkopiebefehl auch beenden würde nämlich mit der ReturnTaste).

Eigentlich sollte mein Lisp laufen, aber wenn ich statt eine Punktes die Returntaste drücke wird der Befehl nicht beendet obwohl die beiden variablen "letztesobjekt" "vorletztesobjet" in diesem Fall gleich sind und der While-Befehl eigentlich ein NIL bekommen sollte. Hier mal meine Lisp:

(defun c:test ()

(setq oldobjekt (car(entsel"\nText wählen:")))
(setq punkt1 (getpoint"\nStartpunkt wählen:"))

(setq oldtext (assoc 1(entget oldobjekt)))
(setq oldtextreal (atof (cdr oldtext)))


(while (/= vorletztesobjekt letztesobjekt)
  (setq vorletztesobjekt (entlast))
  (command "_copy" oldobjekt "" punkt1 PAUSE)
  (setq letztesobjekt (entlast))
  (setq oldtextreal (+ oldtextreal 1))
  (setq newtext (cons 1 (rtos oldtextreal)))
  (entmod(subst newtext oldtext (entget(entlast))))

);end while
)

kann mir bitte irgendjemand sagen, wo hier der Fehler liegt?

vielen Dank vorab

Gruß

Stefan

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 27. Mai. 2007 11:32    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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo Stefan,
ich bin folgendermaßen an das Problem herangegangen: Wenn im Command-Befehl der zweite Punkt der Verschiebung abgefragt und nur mit ENTER bestätigt wird, dann wird automatisch der erste Punkt der Verschiebung verwendet. Die Basispunktkoordinaten der Kopie sind also genau doppelt so groß wie die des ersten Basispunktes. Das war für mich dann das Kriterium, das zuletzt erstellte Objekt wieder zu löschen und die While-Schleife zu verlassen.
Insgesamt habe ich den Code noch ein wenig geändert, z.B. bin ich der Meinung, das der erste Punkt der Verschiebung der Basispunkt des Textes sein sollte, naja, probier Dich mal durch und such die Stücken raus, die Du verwenden kannst.
Code:

(defun c:test1 ( / LASTOBJ N OLDOBJEKT )
  (if (setq oldobjekt (car(entsel "\nText wählen:")))
    (progn
      (setq n 1)
      (while (or (= n 1)
        lastobj)

(command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause)
(if (/=(distance
(cdr(assoc 10 (entget(entlast))))
(mapcar '(lambda(A)
    (* A 2.0))
(cdr (assoc 10 (entget oldobjekt)))))
      0.0)    
  (entmod (subst
    (cons 1 (itoa(+(atoi(cdr(assoc 1 (entget oldobjekt))))n)))
    (assoc 1 (entget (entlast)))
    (entget(setq lastobj(entlast)))))
  (progn
    (entdel (entlast))
    (setq lastobj nil)))
(setq n (+ n 1))))
    (alert "Sie haben keinen Text ausgewählt.")))

------------------
viele Grüße

Jörn

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

Stefan Michel
Mitglied



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

Beiträge: 40
Registriert: 01.06.2006

erstellt am: 04. Jun. 2007 21:19    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 Jörn,

ich bin leider jetzt erst dazugekommen, mir deinen beitrag genauer anzuschauen. ausprobiert habe ich ihn noch nicht, ich bin sicher dass er funktioniert aber ich würde ihn auch gerne kapieren. Dies ist momentan leider noch nicht so ganz der fall! Naja, bei zeilen mit 9 geöffneten klammern ist dass sicherlich auch nicht ganz so einfach!
Nun hab ich aber mal ein paar fragen zu deinem code:
also ich verstehe das erste if ja noch ganz gut, wenn auf etwas geklickt wird läuft der ganze mittelteil ab, wenn auf nichts geklickt wird kommt die fehlermeldung ganz unten. Wenn also ein objekt angeklickt wird wird als erstes N auf 1 gesetzt. Und jetzt happerts bei mir! was soll bei der While-Schleife das (or(= n 1)lastobj)??
im ersten durchlauf ist N=1 also läuft die Schleife durch! was soll aber das (or lastobj). Kannst du mir das genauer erklären?

DANKE vorab

Gruß

Stefan

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 04. Jun. 2007 22:19    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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo Stefan,
ich habe den Code mal mit Kommentarzeilen versehen, ich hoffe man kann es dadurch verstehen (ist nämlich ganz schön schwer sowas in Worte zu fassen)
Code:

(defun c:test1 ( / LASTOBJ N OLDOBJEKT )
  (if (setq oldobjekt (car(entsel "\nText wählen:")))
    (progn
      (setq n 1)
;;;nur für die erste Runde der WHILE-Schleife,
;;;weil die Variable LASTOBJ dann auf jeden Fall NIL ist
        ;;;(als lokal festgelegt)
      (while (or
      ;;;wenn
      (= n 1);;;entweder 1. Runde
      ;;;oder
      lastobj);;;wenn 2. Runde oder höher und LASTOBJ
                      ;;;ungleich nil ist
;;;dann kopieren
(command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause)
;;;wenn der Abstand
(if (/=(distance
(cdr(assoc 10 (entget(entlast))))
;;;vom Basispunktes des neuen Objektes => Kopie
;;;zum doppelten Koordinatenwert des alten Objektes
(mapcar '(lambda(A)
    (* A 2.0))
(cdr (assoc 10 (entget oldobjekt)))))
      0.0);;;ungleich Null ist
          ;;;=> dann ist ein im copy-Befehl ein neuer
                  ;;;Basispunkt ausgewählt worden
          ;;;und deswegen
  (entmod (subst
    (cons 1 (itoa(+(atoi(cdr(assoc 1 (entget oldobjekt))))n)))
    (assoc 1 (entget (entlast)))
    ;;;entmode den Textwert des neuen Textes mit dem
                    ;;;Wert des alten Textes +1
    (entget(setq lastobj(entlast)))))
  ;;;wobei der Variablen LASTOBJ auch (entlast) zugewiesen wird
  ;;;LASTOBJ ist also ungleich nil und somit kommt es in der
  ;;;WHILE-Schleife zu einem weiteren Durchlauf.
 
  (progn
    ;;;wenn der Abstand aber Null ist, dann wurde der
            ;;;copy-Befehl
    ;;;nur mit ENTER bestätigt
    (entdel (entlast))
    ;;;und das zuletzt erstellte Objekt wird wieder gelöscht
    (setq lastobj nil))
  ;;;und der Variablen LASTOBJ wird nil zugewiesen,
  ;;;dann wird die WHILE-Schleife kein weiteres mal durchlaufen
  )
(setq n (+ n 1))
;;;der WErt von N wird hochgezählt, damit die WHILE-Schleife
        ;;;weiß, das Sie jetzt
;;;die Variable LASTOBJ prüfen muss => N ist ungleich 1
))
    (alert "Sie haben keinen Text ausgewählt.")))



------------------
viele Grüße

Jörn

[Diese Nachricht wurde von joern bosse am 04. Jun. 2007 editiert.]

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

Andreas Kraus
Mitglied
Elektrotechniker


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

Beiträge: 1356
Registriert: 11.01.2006

WIN 10
ACAD 2022

erstellt am: 05. Jun. 2007 09:11    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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo Stefan,
vielleicht hilft dir folgendes weiter:

Diese Funktion:

(defun work_beginRightClick (dummy1 dummy2)
  (setq rechtsklick t)
)

wird aufgerufen durch einen Reactor der auf die rechte Maustaste reagiert :

(setq beginRightClick
    (vlr-mouse-reactor
      nil
      '((:vlr-beginRightClick . work_beginRightClick)
)
    )
      )

Vor Programmende Reactor wieder löschen :

(vlr-remove beginRightClick)


Mit der Variablen "rechtsklick" kannst du dann auswerten ob du die rechte Maustaste gedrückt hast. Vielleicht nicht das eleganteste, aber Funktion geht vor Schönheit.
Vielleicht hilfts ja weiter ?

Gruß
Andreas

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

MarkusGa
Mitglied



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

Beiträge: 10
Registriert: 02.07.2001

Windows 7 Pro
AutoCAD 2008 MEP, AutoCAD LT 2013, AutoCAD Building 2013 Standard
Intel I5, 16 GB RAM

erstellt am: 28. Mai. 2013 19: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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo zusammen,

ich muss mal den alten Beitrag wieder hochholen  . Das Lisp ist ungefähr die Lösung für mein Problem. Ich würde gerne einen Text kopieren und diesen dabei hochzählen lassen. Ergebniss soll sein  z. B.

1.1
1.2
1.3
...
1.10
1.11

Enden wird das ganze unter 1.100. Von Jörn habe ich schon ein leicht geänderte Lisp bekommen, hier fängt die Zählerrei aber bei 0.1 an und geht bis 0.9 und macht dann bei 1.x weiter. Leider ist Jörn zur Zeit unterwegs und kann mir nicht weiterhelfen, könntet Ihr dies vielleicht übernehmen?

Lieben Gruß
Markus

PS: Das ist der neue Code von Jörn:

Code:
(defun c:test2 ( / LASTOBJ N OLDOBJEKT)
  ;;;!!!DIMZIN wird nicht automatisch wieder zurückgestellt!!!
  (setvar "DIMZIN" 3)

  if (setq oldobjekt (car(entsel "\nText wählen:")))
  (progn
    (setq n 0.1)
    (while (or
            (= n 0.1)
            lastobj)

      (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause)

      (if (/=(distance
              (cdr(assoc 10 (entget(entlast))))

              (mapcar '(lambda(A)
                          (* A 2.0))
                (cdr (assoc 10 (entget oldobjekt)))))
            0.0)
        (entmod (subst
                  (cons 1 (rtos(+(atof(cdr(assoc 1 (entget oldobjekt))))n)2 1))
                  (assoc 1 (entget (entlast)))
                  (entget(setq lastobj(entlast)))))
        (progn
          (entdel (entlast))
          (setq lastobj nil)))
 
  (setq n (+ n 0.1))
  ))
(alert "Sie haben keinen Text ausgewählt."))


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

Dober Heinz
Mitglied
Technischer Zeichner


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

Beiträge: 1143
Registriert: 20.12.2002

erstellt am: 28. Mai. 2013 20:29    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 Stefan Michel 10 Unities + Antwort hilfreich

Das sollte was für dich sein.

http://lee-mac.com/numinc.html

------------------
Heinz 

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

joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


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

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 30. Mai. 2013 07:13    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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo Markus,
falls der Link von Heinz nicht geholfen hat hier nochmal ein bißchen geänderter Code:
Code:

(defun c:test2 ( / LASTOBJ N OLDOBJEKT)
  ;;;!!!DIMZIN wird nicht automatisch wieder zurückgestellt!!!
  (setvar "DIMZIN" 3)

  if (setq oldobjekt (car(entsel "\nText wählen:")))
  (progn
    (setq n 1)
    (while (or
            (= n 1)
            lastobj)

      (command "_.copy" oldobjekt ""(cdr(assoc 10 (entget oldobjekt)))pause)

      (if (/=(distance
              (cdr(assoc 10 (entget(entlast))))

              (mapcar '(lambda(A)
                          (* A 2.0))
                (cdr (assoc 10 (entget oldobjekt)))))
            0.0)
        (entmod (subst
                  (cons 1
                  (strcat(itoa(fix(atof(cdr(assoc 1 (entget oldobjekt))))))"."(itoa n)))
                  (assoc 1 (entget (entlast)))
                  (entget(setq lastobj(entlast)))))
        (progn
          (entdel (entlast))
          (setq lastobj nil)))

  (setq n (+ n 1))
  ))
(alert "Sie haben keinen Text ausgewählt."))


Damit sollte jetzt auch 1.1, 1.2. .... 1.9, 1.10, 1.11 usw. funktionieren.


------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

Koordinatenausgabe Youtube

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

MarkusGa
Mitglied



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

Beiträge: 10
Registriert: 02.07.2001

Windows 7 Pro
AutoCAD 2008 MEP, AutoCAD LT 2013, AutoCAD Building 2013 Standard
Intel I5, 16 GB RAM

erstellt am: 04. Jun. 2013 14:11    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 Stefan Michel 10 Unities + Antwort hilfreich

Hallo,

danke Euch beiden für die Lösungen. Das Tool was Heinz empfohlen hat ist absolut perfekt dafür. Danke Euch nochmal!!!

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