• Dieses Forum ist die maschinengenerierte Übersetzung von www.cad3d.it/forum1 - der italienischen Design-Community. Einige Begriffe sind nicht korrekt übersetzt.

Schreibe einen Textstring mit variabler Schriftgröße

  • Ersteller Ersteller Angelo2449
  • Erstellt am Erstellt am

Angelo2449

Guest
Hallo alle,
Ich suche nach der Lösung, mit der ich durch autolisp einen Textstring mit variabler Höhe schreiben soll.
Der Text sollte so strukturiert sein:
- erste n Zeichen mit Höhe 20
- das folgende mit der Höhe 5
alles in einem String.
Hat jemand eine Idee?
Danke.
 
Wir betreten die Welt des mtext, wo Formatierungen zu Selbstmord führen können.
ein Beispiel Landland könnte dies sein:
Code:
(entmake)
(Liste)
(cons 0 "mtext")
(cons 8 "pippo")
(cons 100 "acdbentity")
(cons 100 "acdbmtext")
(cons 10 '(5.0 10.0))
(cons 40 20.0)
(cons 7 "arial")
(cons 1 "testo alto 20 {\h0.25x;testo alto cinque}")
)
)
Das schafft einen mtext
in Nummer (5,10)
auf der "Pippo"-Schicht
mit Schrift = "arial"
mit Anfangshöhe = 20
mit Endhöhe = 20x0.25 = 5
 
Danke für die Antwort, ich versuche herauszufinden, wie ich in das Programm eingreifen kann, das ich schwer zu schreiben versuche (wie Sie verstehen werden, dass ich ein Neophyt bin und versuchen, aus der Erfahrung von denen zu ziehen, die mehr als ich wissen!).
Dies ist der Zweig der dxf-Datei, die mein Programm erzeugt:
Kreis
8)
Kreise ' Schicht
ANHANG
1
10.
1498789.579000 Koordinaten Ostkreis
20
5042431.954000 koordinierter Nordkreis
40
0,50
0)
Text
5.
0)
8)
Text
ANHANG
1
10.
Gemeinschaftsrecht, EG Gerichtshof
20
5042432.454000 koordinierter Nordtext
40
40
0,40
50
0)
1
p1 (165.03) - 4420571.480,698896.546,4529362.926' String geschriebener Text
0)
deutlich muss der String so formatiert werden, dass er sich dann mit variabler Höhe (vor dem großen Einschnitt (0,40) aus dem kleinen Einschnitt (0.05) ergibt.
Danke.
 
Hallo alle,
nach den Angaben der Freunde, die mir antworteten, schrieb ich diesen Code:
Code:
(defunc c:Wechselhöhe (/)

(setq string nil)
(sing)
(= String nil)
(setq string (entsel "\nselect the point name: ")
)

(setq string (entget (car string)))
(setq txt1 (cdr 1 string)))
(princ txt)

(setq text1 (substr txt1 1 3))
(Sectq text2 (Substr txt1 4) ; ab 4 Uhr)
;(Befehl "_mtext" Pausen "_j" "_bl" "_w" 50 (Strcat text1 "{\h0.2x;" text2 "}") "
)
das Ergebnis ist ein String mit zwei Höhen des Textes an einem Punkt, der durch den Befehl _mtetxt gekennzeichnet ist

Ich möchte jedoch, dass das Programm anstelle des Einfügens des neuen Textes direkt den ausgewählten String am Start (String) aktualisieren würde.
Danke.
 
wie ich Ihre Anweisungen anwenden kann:
Code:
(setq string "aaaaaabbbbbbbbbbb")
... Anweisungen
(Setq-Ergebnis "aaaaaa" mit Höhe 20 und "bbbbb" mit Höhe 5)
grazie.
 
....Ich möchte jedoch, dass das Programm anstelle des Einfügens des neuen Textes direkt den ausgewählten String am Anfang (String) aktualisieren würde.
Danke.
nur mtexts können verschiedene Texthöhen anzeigen, wenn der String, den Sie ändern möchten, zu einem mtext gehört, können Sie ihn aktualisieren, sonst nicht.
Ich weiß nicht, was los ist.
 
Ich schrieb diesen Code, der gutartig funktioniert:
Code:
(defunc c:Wechselhöhe (/)

(setq string nil)
(sing)
(= String nil)
(setq string (entsel "\nselect the point name: ")
(setq Element (car string))
)

(setq string (entget (car string)))
(setq txt1 (cdr 1 string)))

(setq cxy (assoc 10 string))
(setq cox)
(setq coy (cadddr cxy)
(princ " - ")
(princ cox)
(princ ",")
(princ coy)
(princ " - ")
(Befehl "_erase" Element ")
(setq coox (rtos cox)
(setq cooy (rtos coy)
(setq Adresse (strcat coox "," cooy))

(setq text1 (substr txt1 1 3))
(Sectq text2 (Substr txt1 4) ; ab 4 Uhr)
;(Befehl "_mtext" "50,50" "_j" "_bl" "_w" 50 (Strcat text1 "{\h0.2x;" text2 "}") "
(Befehl "_mtext" Adresse "_j" "_bl" "_w" 50 (Strcat text1 "{\h0.2x;" text2 "}") ")
)
wie Sie sehen können, ändert das Programm den ausgewählten Text in einer modifizierten mit variabler Höhe (nach den eingestellten Parametern).
Wenn Sie es optimieren können, ist Beratung willkommen.
Ich möchte nun mit der Code-Implementierung die Routine schreiben, die durch die Prüfung aller in > .dwg < enthaltenen Strings durch einen Code (z.B. > "*" + Elementnummer < in der einzelnen String enthalten ist, um jeden unterbrochenen String zu ändern.
Zwei Probleme:
1 - die Anzahl der vorhandenen Strings (in > .dwg < gibt es nur Strings und Kreise, die durch das Lesen der > .dxf <-Datei, die von der Basis erzeugt wird, geschrieben werden).
2 - Suche nach jedem String zyklisch mit einem entsprechenden Befehl.
Danke.
 
Code:
[B](setq tt (ssget "_x"(0. "text,mtext")(1. "a*,b*")))[/B] [COLOR="#FF0000"]alle Texte und mtext beginnend mit "a" oder "b"[/COLOR]

[B](Repeat (setq n (sslength tt))[/B] [COLOR="#FF0000"][/COLOR][COLOR="#FF0000"];Leben für die Anzahl der gefundenen Objekte[/COLOR]
    [B](setq tt (Name ttt)[/B] [COLOR="#FF0000"]; jeder Zyklus bietet [B]Name[/B] des Objekts[/COLOR]
    [B]< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <[COLOR="#0000FF"]etwas zum Objekt tun[/COLOR]>[/B])
 
dank gp, es funktioniert perfekt.
Ich habe Ihren Code mit meinem :
Code:
(Defun c:cstr)

(setq tt (ssget "_x"(0 . "text,mtext")(1 . "p*"))))

(Repeat (setq n (sslength tt))
(setq tt (ssname tt (setq n (1-n))))

(setq string)
(setq txt1 (assoc 1 string))
(setq txt1 (cdr txt1)
(setq lungh (- (strlen txt1) 63)

(setq cxy (assoc 10 string))
(setq cox)
(setq coy (cadddr cxy)
(Befehl "_erase" tt)
(setq coox (rtos cox)
(setq cooy (rtos coy)
(setq Adresse (strcat coox "," cooy))

(setq text1 (substr txt1 1 lungh)); punktname
(setq text2 (substr txt1 (+ lungh 1))); ab dem Namen des Punktes
(Befehl "_mtext" Adresse "_j" "_bl" "_w" 50 (Strcat text1 "{\h0.1x;" text2 "}") ")

)
)
und ich bekomme das Ergebnis, das ich wollte, danke nochmals.
 
Danke.
Ich habe Ihren Vorschlag und anscheinend alles funktioniert, das ist Code :
Code:
(defun cstr)

(setq tt (ssget "_x"((0 . "text,mtext")(1 . "p*"))))))

(Repeat)
(setq tt (sssname tt (setq n (1-n))))

(setq string (entget tt))
(setq txt1 (assoc 1 string))
(setq txt1 (cdr txt1)
(setq lungh (- (strlen txt1) 60)

(setq cxy (assoc 10 string))
(setq cox (cadr cxy))
(setq coy (cadddr cxy))
(Befehl "_erase" tt ")
(setq coox (rtos cox))
(setq cooy (rtos coy))
(setq indirizzo (strcat coox," cooy))

(setq testo1 (substr txt1 2 lungh) ; nome del punto
(setq testo2 (substr txt1 (+ lungh 2)) ; dal nome del punto in poi
(Befehl "_mtext" indirizzo "_j" "_bl" "_w" 50 (Strcat testo1 "{\h0.1x;" testo2 "}")

)
Strings werden geändert und in der gewünschten Weise angezeigt oder, der erste Teil mit großen Zeichen und der zweite mit kleinen Zeichen.
der nächste Schritt, wenn ich den String wähle, wird derselbe nicht wie er erscheint zurückgegeben, sondern enthält die Kontrollzeichen, die verwendet werden, um den > großen - kleinen < Effekt zu erreichen.
Dies ist der Befehlscode einschließlich der Ergebnisse:
Code:
(defun reference (/)

(falls)
(Progn)
(Start "c:\\transformer\\helpinlinea\rif.exe "c:\\transformer\\helpinlinea\rif.tkn")
(Auszug)
)
)

(falls)
(Alert "die Referenzlinie wurde bereits eingefügt")
)

(Sectq und 1 nil)
(sing)
(= ed1 nil)
(setq ed1 (entsel "\nselect the reference line : ")))
)

(setq ed1 (entget (car ed1))
(setq txt1 (cdr 1 ed1)
(setq txt2 (cdr 10 ed1)
(princ "\n")
(princ txt)
;p2 (164,93)
(princ "\n")
(princ txt)
;(1.4988e+06 5.04244e+06 0.0)
(princ "\n")

(setq lung (strlen txt1)
(- Lunge 77)
(Setq Basisname (substr txt1 1 lungnomebase))
(princ "\n")
(Hauptname)
ANHANG
(princ "\n")
(Princ Lunge)
;
(princ "\n")

(setq notax)

(Setq Station)
(Einzelpersonen)

(cond)
((= notax "cm" ) (setq notax "miniated nail"))
((= notax "sf" ) (setq notax "spigolo fabricated"))
((= notax "sr" ) (setq notax "spigolo Zaun"))
((= notax "re" ) (setq notax "recinction"))
((= notax "st" ) (setq notax "sign to the Ground"))
((= notex "pi" ) (setq notax "picchetto"))
((= notax "to" ) (setq notax "tombino"))
((= notax "ct" ) (setq notax "centro tombino"))
)

(setq pos1 (- (strlen txt1) 58)
(setq xyz (substr txt1 pos1 34)
(princ "\n")
(princ xyz)
;4420568.319,698901.058,4529365.156
(princ "\n")

(Setq cxb (substr xyz 1 11)
(princ cxb)
;4420568.319
(princ "\n")
(setq cyb (substr xyz 13 10)
(princ cyb)
;698901.058
(princ "\n")
(setq czb (substr xyz 24 11)
(princ czb)
;4529365.156
(princ "\n")

(setq cxbb (atof cxb))
(princ cxbb)
;4.42057e+06
(princ "\n")
(setq cybb (atof cyb))
(princ cybb)
;69890
(princ "\n")
(setq czbb)
(princ czbb)
;4.52937+06
(princ "\n")

(setq note2 (strcat name puntobase " - " notax " - " station))
(setq Referenz (strcat "1|" Station "|" xyz "0.0000,000 wgs84-rtf2000]|" Note2 "")")
(setq secondline "6|l1|14122017-20:12|14122017-20:12rtrtk|pdop=1|)
(setq stringa1 (strcat reference "" zweite Zeile)
(princ string)
;1|80000|4420568.319,698901.058,4529365.156|0,000 wgs84-rtf2000]|p2 - recinzione - 80000| 6|l1|14122017-20|:1214122017-20:12rtrtk|pdop=1|
(princ "\n")

(Sectq und nil)

(sing)
(und (/= re "s") (/= re "n")
(s/n)
(setq re (getstring)
(seq re (strcase re)
)

(f)
(= s)
(Progn)
(Setq fp1 (offen "c:\\\\trasformer\\\librettopregeo.dat" "a"))
(Referenz der Schreibzeile fp1)
(writing line secondline fp1)
(Schließe fp)
)
)

(setq ind)
(setq index(strcat ind nomepuntobase))

(seq primariga) 1)
(alert string)

)
wie Sie bemerken, um den String zu bekommen, wie ich ihn brauche, muss ich ihn reinigen.
Der hierin beigefügte Code ist in einem viel längeren Term > pre.lsp < enthalten, nach der ersten Verwendung des Verweises < Befehl, auf eine neue Referenz desselben, Ich erhalte diesen Fehler:
Code:
ohne erste Anrufung (*push-error-using-command*) nicht (Befehl) von* Error* anrufbar.
Wir empfehlen die Konvertierung (Befehl) von Anrufen in (Befehle).
und ich muss wieder aufladen > vor.lsp <, so zu jeder Verwendung > Referenz <!
Ich kann nicht finden, was dieses Verhalten verursacht.
Danke.
 
Jetzt habe ich keine Zeit, um in Ihre Liste zu schauen, aber das erste, was in den Sinn kommt, ist, dass Sie die Variablen nach der Verwendung der Routine zurücksetzen müssen, das heißt "sie lokalisieren".
um dies zu tun, müssen Sie sie nach der Bar in der Linie des Defuns platzieren, z.B.:(defun c:pippofranco) ed1 txt2)Also beginnt jeder Start Jungfrauen.
 
Danke.
Ich habe die Variablen privat gemacht, aber das oben erwähnte Problem bleibt oder ich kann den Befehl nicht neu laden.
Ich bemerkte auch ein weiteres Problem:
Anlegen des Befehls, der die Strings verändert, wenn zwei überlappende Strings sogar teilweise vorhanden sind, erscheinen die relativ modifizierten Texte nicht in der Position, in der sie sein sollten, sondern mit der gleichen horizontalen Ausrichtung übereinander.
Hard!
Danke.
(p.s., es scheint mir, dass sich das Problem mit der ursprünglichen Zoom manifestiert, wenn ich auf die besondere, es scheint mir, alles ist in Ordnung. )
 
beim Einfügen von Entitäten in die Zeichnung müssen Sie die aktive Osnap berücksichtigen, die durch Änderung der Einführstelle stören.
diese Funktion wird verwendet, um osnap zu aktivieren / zu deaktivieren:
; ein- oder ausschalten osnap, äquivalent zu f3 Schlüssel
(defun setosnaponoff(mode/osmode)
(setq osmode (getvar "osmode")
(falls)
(falls) osmode 16384)
(Setvar "osmode" (- osmode 16384))
)
(falls) osmode 16384)
(setvar "osmode" (+ osmode 16384))
)
)
)
 
dank rpor66, erfolgreich mit osmode gesetzt auf 0.
Jetzt müssen wir die Lösung für das andere gemeldete Problem finden.
 

Statistik des Forums

Themen
58.521
Beiträge
499.056
Mitglieder
104.110
Neuestes Mitglied
ChristianR

Zurzeit aktive Besucher

Keine Mitglieder online.
Zurück
Oben