CADsite forum

AutoCAD => Autolisp => Topic gestart door: martin op wo 24 08 2016, 10:59:19

Titel: selecteren uit dxf file
Bericht door: martin op wo 24 08 2016, 10:59:19
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
Titel: Re: selecteren uit dxf file
Bericht door: bart op do 25 08 2016, 16:11:32
Wat is het doel en de winst van dit vooraf selecteren.
Titel: Re: selecteren uit dxf file
Bericht door: gery op do 25 08 2016, 16:49:47
Wat bedoel je eigenlijk met "vooraf"? Vooraf aan wat?
Titel: Re: selecteren uit dxf file
Bericht door: martin op vr 26 08 2016, 07:34:08
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
Titel: Re: selecteren uit dxf file
Bericht door: 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"))))

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.
Titel: Re: selecteren uit dxf file
Bericht door: 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
Titel: Re: selecteren uit dxf file
Bericht door: gery op vr 26 08 2016, 11:37:59
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.
Titel: Re: selecteren uit dxf file
Bericht door: EddyBeerke op vr 26 08 2016, 15:25:03
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)

Titel: Re: selecteren uit dxf file
Bericht door: martin op wo 31 08 2016, 11:19:51
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
Titel: Re: selecteren uit dxf file
Bericht door: EddyBeerke op wo 31 08 2016, 22:51:24
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.

Titel: Re: selecteren uit dxf file
Bericht door: martin op di 06 09 2016, 14:01:59
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
Titel: Re: selecteren uit dxf file
Bericht door: julien op wo 07 09 2016, 16:59:13
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:
Titel: Re: selecteren uit dxf file
Bericht door: martin op do 08 09 2016, 10:32:02
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

Titel: Re: selecteren uit dxf file
Bericht door: 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.
Titel: Re: selecteren uit dxf file
Bericht door: EddyBeerke op vr 09 09 2016, 12:30:36
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???
Titel: Re: selecteren uit dxf file
Bericht door: roy_043 op vr 09 09 2016, 13:31:21
Houd er rekening mee dat het block 'stamp' geen attributes heeft maar vaste teksten. De definitie van dit block is dus, afhankelijk van de schaal, in elke DXF verschillend. Dit is een probleem als je de DXFs in dezelfde tekening wilt inserten. In een dwg kan immers per block-naam maar één enkele block-definitie bestaan.

Voorbeeld:

Insert-volgorde:
0000001.dxf
0000002.dxf
Resultaat:
Beide inserts hebben nu de schaalaanduiding 1:35

Insert-volgorde:
0000002.dxf
0000001.dxf
Resultaat:
Beide inserts hebben nu de schaalaanduiding 1:45

Het valt op dat in de verschaalde DXF sprake is van 'dim overrides'. Door de 'override' tekst te vergelijken met de maat tussen de meetpunten van een maatlijn moet de schaalfactor ook te achterhalen zijn.
Titel: Re: selecteren uit dxf file
Bericht door: martin op vr 09 09 2016, 21:08:07
Het plan is om de blocks "stamp" bij het inserten steeds te exploden, vervolgens de tekening te purgen, dan is het block weg, en dan met de routine het volgende dxf weer inserten, dan zal hij het block als nieuw inlezen en is de (nieuwe) schaal wel aanwezig.
Klinkt simpel, maar om dit hele spectacel in de code te zetten, weet ik niet op welke plaats en hoe.
De truc is om na het inserten de schaal te selecteren, hoe moet dat?
Hoe kan je bijvoorbeeld een window selecteren en dan vervolgens een tekst hierin selecteren met een bepaalde grootte ?
groet,Martin

Titel: Re: selecteren uit dxf file
Bericht door: gery op vr 09 09 2016, 21:23:30
Citaat van: martin op vr 09 09 2016, 21:08:07Hoe kan je bijvoorbeeld een window selecteren en dan vervolgens een tekst hierin selecteren met een bepaalde grootte ?
Wat dacht je hiervan: http://www.cadsite.be/smf/index.php?topic=6487.msg33932#msg33932
Titel: Re: selecteren uit dxf file
Bericht door: martin op vr 09 09 2016, 22:16:11
ssget "_X" is toch de hele tekening? kan je dit ook met een window?
Titel: Re: selecteren uit dxf file
Bericht door: gery op vr 09 09 2016, 22:33:20
Er zijn vele mogelijkheden: http://www.lee-mac.com/ssget.html
Titel: Re: selecteren uit dxf file
Bericht door: roy_043 op za 10 09 2016, 14:42:38
Het is, denk ik, logischer om de schaal vast te stellen voordat de insert wordt geëxplodeerd.
(defun SchaalUitStamp ( / scl)
  (if (tblobjname "block" "stamp")
    (vlax-for obj (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "stamp")
      (if
        (and
          (= "AcDbText" (vla-get-objectname obj))
          (equal 2.4 (vla-get-height obj) 0.05)
          (wcmatch (vla-get-textstring obj) "~*[~0123456789]*")
        )
        (setq scl (atoi (vla-get-textstring obj)))
      )
    )
  )
  scl
)


Direct na het inserten van een DXF kun je deze code invoegen om te verschalen.
(if
  (and
    (setq scl (SchaalUitStamp))
    (/= 35 scl)
  )
  (command "_.scale" (entlast) "" (list x0 y0) (/ scl 35.0))
)


Voorwaarde is wel dat je na het exploderen het block "stamp" steeds purget.
Titel: Re: selecteren uit dxf file
Bericht door: EddyBeerke op di 13 09 2016, 11:58:37
Citaat van: roy_043 op za 10 09 2016, 14:42:38
Het is, denk ik, logischer om de schaal vast te stellen voordat de insert wordt geëxplodeerd.
(defun SchaalUitStamp ( / scl)
  (if (tblobjname "block" "stamp")
    (vlax-for obj (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) "stamp")
      (if
        (and
          (= "AcDbText" (vla-get-objectname obj))
          (equal 2.4 (vla-get-height obj) 0.05)
          (wcmatch (vla-get-textstring obj) "~*[~0123456789]*")
        )
        (setq scl (atoi (vla-get-textstring obj)))
      )
    )
  )
  scl
)

...

Hoe ga je om met deze text ->> 2.399999999999999:
AcDbText
10
-73.53833399999999
20
8.245836999999999
30
0.0
40
2.399999999999999
  1
35
  7
Stempel
Titel: Re: selecteren uit dxf file
Bericht door: roy_043 op di 13 09 2016, 12:38:08
Citaat van: EddyBeerke op di 13 09 2016, 11:58:37
Hoe ga je om met deze text ->> 2.399999999999999:
Ik gebruik (equal) inclusief het optionele 'fuzz' argument:
Citaat van: http://docs.autodesk.com/ACD/2011/ENU/filesALR/WS1a9193826455f5ff1a32d8d10ebc6b7ccc-6a38.htm(equal expr1 expr2 [fuzz])
Titel: Re: selecteren uit dxf file
Bericht door: martin op di 13 09 2016, 20:56:25
Bedankt voor de tips, ik ga er binnenkort mee verder.

Eddy, waarom vraag je dat van 2.399999999999999 ?
Wat gaat er nu niet goed?
groetjes,Martin
Titel: Re: selecteren uit dxf file
Bericht door: EddyBeerke op wo 14 09 2016, 13:02:57
Citaat van: roy_043 op di 13 09 2016, 12:38:08
Ik gebruik (equal) inclusief het optionele 'fuzz' argument:
Oke, weer wat geleerd.
Citaat van: martin op di 13 09 2016, 20:56:25
...
Eddy, waarom vraag je dat van 2.399999999999999 ?
Wat gaat er nu niet goed?
Wat gaat er nu wel mis?  :mrgreen:

Wilde weten hoe Roy dat oploste, en nu weet ik dat.
Kan ook nog veel leren!  :pintje: