FastFiber

selecteren uit dxf file

Gestart door martin, wo 24 08 2016, 10:59:19

Vorige topic - Volgende topic

martin

beste mensen,
kan je vooraf uit een dxf tekening een getal selecteren? Dit getal heeft een teksthoogte van 84mm.
Ik moet namelijk iets met de schaal van een aantal dxf tekeningen gaan doen, en deze schaal heeft als enige een teksthoogte van 84mm, dus daar kan je op selecteren, dacht ik.
Maar het liefst vooraf, kan dat? Hoe? Het pad en tekening naam is bekend.
groet,Martin

bart

Wat is het doel en de winst van dit vooraf selecteren.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

gery

Wat bedoel je eigenlijk met "vooraf"? Vooraf aan wat?
AutoCAD 2020 - Windows 10

martin

ik moet de tekeningen inlezen. Maar hiervan heb ik de schaal nodig.
Zoiets als selecteren op dxfcode 40 (height) en dxfcode 1 (value).
Op het forum kwam ik "vla-put-subject" tegen, is dat hiervoor?
Hoe maak je daar een code van?
groetjes,Martin

gery

Maak een selection set met een filter op basis van de teksthoogte, zoiets bijv.:

(setq #ss (ssget "_X" '((0 . "text")(40 . "84"))))

Nu lees je de waarde van dit object uit en je hebt de schaal, zoiets bijv.:

(setq #Scale (cdr (assoc 1 (entget (ssname #ss 0)))))

Opgelet, dit is niet getest dus het zou wel eens niet onmiddelijk kunnen werken.
Als u enkel DXF bestanden upload, kan ik daarop testen.
AutoCAD 2020 - Windows 10

martin

Dank voor je reactie. Ik ga het proberen.

ik moet diverse dxf files inlezen.
Van welke tekening neemt neemt hij nu de waarde, de tekening die je het laatst ge-insert hebt?

Met vooraf bedoel ik voordat ik "insert" doe wil ik graag de schaal weten.
normaal is bij ons schaal 1:35 de scalefactor 1. Als een tekening een schaal 1:40 heeft moet ik de tekening inserten met een grotere schaal, namelijk maal scalefactor 40/35.
Dat komt omdat een extern programma die de dxf aanlevert alle tekeningen verschaalt die anders zijn dan 1:35, dan zijn ze niet 1:1 in autocad, moet ik ze verschalen.

groetjes, Martin

gery

Citaat van: martin op vr 26 08 2016, 10:09:50Van welke tekening neemt neemt hij nu de waarde, de tekening die je het laatst ge-insert hebt?
Van de actieve uiteraard.
AutoCAD 2020 - Windows 10

EddyBeerke

Citaat van: martin op vr 26 08 2016, 10:09:50
Dank voor je reactie. Ik ga het proberen.

ik moet diverse dxf files inlezen.
Van welke tekening neemt neemt hij nu de waarde, de tekening die je het laatst ge-insert hebt?

Met vooraf bedoel ik voordat ik "insert" doe wil ik graag de schaal weten.
normaal is bij ons schaal 1:35 de scalefactor 1. Als een tekening een schaal 1:40 heeft moet ik de tekening inserten met een grotere schaal, namelijk maal scalefactor 40/35.
Dat komt omdat een extern programma die de dxf aanlevert alle tekeningen verschaalt die anders zijn dan 1:35, dan zijn ze niet 1:1 in autocad, moet ik ze verschalen.

groetjes, Martin

De werkmethode zou dan zoiets als dit moeten zijn:
1 - insert de tekening op b.v. 0,0,0
2 - zoek in het block die speciale tekst:
Citaat van: gery op vr 26 08 2016, 09:54:28
Maak een selection set met een filter op basis van de teksthoogte, zoiets bijv.:

(setq #ss (ssget "_X" '((0 . "text")(40 . "84"))))
3 - verschaal het block met "maal #Scale/35"
4 - laats het block op de juiste locatie

Jij vraagt om "vooraf" de schaal op te vragen maar met lisp gaat dat niet.
Wel "achteraf", dus na het inserten, je kunt namelijk daarna pas weten wat dat getal moet zijn.

Tenzij de DXF een text bestand is, dan kun je die inladen en elke regel evalueren tot je die bewuste regel voor de schaal tegenkomt.

Test het met deze lisp eens...:
(defun c:test ( / schaal )
(setq schaal (getblkitems))
(princ (strcat "Schaal is: " schaal))
  (princ)
 
)


(defun getblkitems ( / sel nfo items ent o)
(command "insert" "test" "0,0,0" 1 1 0)
(if (setq sel (entlast))
(progn
(setq nfo (entget sel))
;(if (and (setq sel (entsel "Select a block: "))(= (cdr (assoc 0 (setq nfo (entget (car sel))))) "INSERT"))
    (foreach ent (vlax-for item (vla-item (vla-get-blocks (vla-get-activedocument  (vlax-get-acad-object)))(cdr (assoc 2 nfo)))(setq items (cons (vlax-vla-object->ename item) items)))
(setq o (vlax-ename->vla-object ent))
(if (vlax-property-available-p o "Height")
(if (= (vla-get-Height o) 84.0)
(setq schaal (vla-get-textstring o))
) ;end if
);end if

); end foreach
);end progn
    (prompt "\nNo block selected.")
  );end if
)


Start met het commando "TEST"
Enige voorwaarde is dat je een block moet hebben met de naam "test" met daarin een text hoogte 84.0
->> (command "insert" "test" "0,0,0" 1 1 0)

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

martin

Bedankt Eddy. Ik ga er volgende week mee verder.
Ik heb nog eventjes een heel andere vraag.
Sinds vorige week hebben we op het werk acad 2013 en daarvoor 2010.
Alleen nu moet ik steeds mijn osnap settings invullen.
Bij de 2010 versie onthield hij deze gewoon.
Is dat ergens een instelling?
groetjes, Martin

EddyBeerke

Citaat van: martin op wo 31 08 2016, 11:19:51
Ik heb nog eventjes een heel andere vraag.
Sinds vorige week hebben we op het werk acad 2013 en daarvoor 2010.
Alleen nu moet ik steeds mijn osnap settings invullen.
Bij de 2010 versie onthield hij deze gewoon.
Is dat ergens een instelling?
groetjes, Martin
Martin,

Ik wil je vragen om voor deze vraag een ander topic te starten.

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

martin

Beste Eddy,
Ik heb mijn gehele code bijgevoegd.
De code van de eerste bijlage werkt.
Bij de tweede bijlage heb ik jouw code geprobeerd toe te voegen (voor het verschalen).
Dat lukt mij niet, kan je mij op weg helpen ?

(Dankzij dit forum heb ik hem toe zover werkend gekregen, maar nu heb ik hulp nodig)

De dxf file is een tekst bestand, kan je daar ook gegevens uit halen?
Dan kan je voordat je gaat inserten de schaal al opvragen?

(ik wilde nog dxf files toevoegen als voorbeeld, maar dat lukt niet)
met vriendelijke groet, Martin

julien

Citaat van: martin op di 06 09 2016, 14:01:59
(ik wilde nog dxf files toevoegen als voorbeeld, maar dat lukt niet)
Nu zou het normaal gezien wel moeten lukken.  :wink:

martin

Bijlagen met dxf files toegevoegd.
Zo levert een programma de dxf`s aan.
Je ziet dat de tweede bijlage schaal 1:45 is, maar is niet 1:1 getekend,
daarom is het de bedoeling alles wat afwijkt te verschalen (bijv 45/35=1.2857 en 50/35=1.4285)
Deze schaal (tekstgrootte 84) heb je hiervoor nodig.
Mijn vraag is hoe krijg je dat in vredesnaam in de code?

groetjes, Martin


bart

In de dxf zit de tekst in een blokje welke een x en y schaal van 30 heeft.
De tekst is geen 84 maar 2,4units hoog (2,4*30=84)
De schaal is overigens opgebouwd  uit twee losse teksten 1:  en 45 zijn apart.

Je zal dus ook de juiste tekst moeten selecteren voor je verschaling.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

EddyBeerke

Citaat van: bart op do 08 09 2016, 12:32:11
In de dxf zit de tekst in een blokje welke een x en y schaal van 30 heeft.
De tekst is geen 84 maar 2,4units hoog (2,4*30=84)
De schaal is overigens opgebouwd  uit twee losse teksten 1:  en 45 zijn apart.

Je zal dus ook de juiste tekst moeten selecteren voor je verschaling.

Hmmm... lastig als dat block ook telkens verschaald is.
In 0000001.dxf heeft het block "stamp" een schaal van 35
en de spesifieke text een schaal van: 2.399999999999999
en de tekst waarde is ook "35"

Citaat van: 0000001.dxfAcDbText
10
-73.53833399999999
20
8.245836999999999
30
0.0
40
2.399999999999999
  1
35
  7
Stempel
Misschien is dan achteraf verschalen een betere/makelijkere optie:
Het block "stamp" exploderen en de tekst filteren, je weet dat het niet de tekst met "1:" moet zijn.
Waarde uitlezen, alles selecteren en verschalen.
Hou je wel rekening mee dat de units op "FEET" staan???
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

FastFiber