FastFiber

lastig vraagje.

Gestart door TeQnologie, do 18 08 2005, 11:24:18

Vorige topic - Volgende topic

TeQnologie

Ik heb bijvoorbeeld een rectangle en ik wil daar de oppervlakte van weten, dat is opzich geen probleem ik kijk in properties en ik weet de oppervlakte..

Maar nu vraag ik me af of het mogelijk is om bijvoorbeeld die rectangle te koppelen aan text. dat ik een rectangle maak en dat ik dan in een stuk text meteen zie wat de  oppervlakte is. en dan wanneer ik bijvoorbeeld me rectangle iets groter maak dat het aantal m² dan ook omhoog gaat. zonder dat ik in properties hoef te kijken en het zo aan te passen.

Kenny H

Dag TeQnologie,

Ik heb hier een lispje waarmee je een rechthoek tekend en die daarvan de oppervlakte berekend.
Aanpassen van de rechthoek mag je echter niet doen.

:!: Het is gewoon een probeersel van mij
Via die area kun je ook een opp verkrijgen maar die maat is niet selecteerbaar dus moet je het wel bereken.


Citeer(defun c:test ()
 (setq hoek1 (getpoint "\nSelecteer linker onderhoek aub:"))
 (setq   hoek3 (getcorner hoek1
          "\nSelecteer rechter bovenhoek aub:"
         )
 )
 (command "rectangle" hoek1 hoek3)
 (setq lengtex (- (car hoek3) (car hoek1)))
 (setq lengtey (- (cadr hoek3) (cadr hoek1)))
 (setq oppervlak (* lengtex lengtey))
 (setq   punt (list (+ (car hoek1) (/ lengtex 2))
         (+ (cadr hoek1) (/ lengtey 2))
        )
 )
 (command "text" punt "" "" oppervlak)
)
8) Volvo 4 Life 8)

Johan Glasbergen

Als je met de versie 2005 of 2006 werkt kan je een field aan de rectangle koppelen welke de oppervlakte weergeeft.

WebRacer

inderdaad... in 2006 kan dat... maar ik moet nog eens uitpluizen hoe, met visual lisp kan je het ook oplossen... ik zal deze avond eens kijken of ik niets heb dat er op lijkt...
?

bart

met lisp kan het niet realtime
je moet dan altijd een actie ondernemen om de gegevens te updaten
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Kenny H

Hallo allemaal,

Ik heb mij even bezig gehouden met die field.
Ik moet nog allerlij commando's eens uit testen van er zijn er nog een aantal die ik niet ken. :oops:

Ge typt field in op de commando regel.
Dan zet ge uw Fieldname op object, klik op de knop op uw rechthoek ed te selecteren,
Property op area, Spelen met format om uw gewenste maat voering te krijgen, oke klikken, oppervlaktemaat plaatsen.
Via field format kun je ook nog bv m² enz achter uw maat zetten.

Maar dan mag je ook uw figuur niet meer wijzigen.
Als je ze wijzigt moet je opnieuw field herhalen. :wink:
8) Volvo 4 Life 8)

WebRacer

Kopieer wat GEEL is naar een standaard txt-file, en maak van die file: Rechthoek.lsp (of zoiets).
Sluit de file en zet hem op een vindbare plaats op uw PC.

Laden doe je in autocad door 'AP' in te typen en de file op te halen..
starten van het progje doe je met 'RH'.
Even terzijde: orthomode aan stellen bij het stretchen kan problemen vermijden.


(defun c:RH (/ pt1 pt2 ptlist tmp RectangObject)
 (vl-load-com)
 (setq doc (vla-get-activeDocument (vlax-get-acad-object)))
 (setq mspace (vla-get-modelSpace doc))
 (setq pt1 (getpoint "\nGeef Startpunt: "))
 (setq pt2 (getcorner "\nGeef Hoekpunt: " pt1))
 (setq ptlist (cons (list (car pt1) (cadr pt1)) ptlist))
 (setq ptlist (cons (list (car pt1) (cadr pt2)) ptlist))
 (setq ptlist (cons (list (car pt2) (cadr pt2)) ptlist))
 (setq ptlist (cons (list (car pt2) (cadr pt1)) ptlist))
 (setq ptlist (cons (list (car pt1) (cadr pt1)) ptlist))
 (setq ptlist (apply 'append ptlist))
 (if (= (rem (length ptlist) 2) 0)
   (progn
     (setq
        tmp (vlax-make-safearray vlax-vbDouble (cons 0 (- (length ptlist) 1)))
     )
     (vlax-safearray-fill tmp ptlist)
     (setq RectangObject (vla-addLightweightPolyline mspace tmp))
   )
 )
   
 (if RectangObject
   (setq RectangReactor (vlr-object-reactor (list RectangObject) "Rectang Reactor" '((:vlr-modified . rShowArea))))
 )

 
 (princ (strcat "\n*** The Area is " (rtos (vla-get-Area RectangObject) 2 3)))(princ)
)
(defun rShowArea (notifier-object reactor parameter-list)
 (cond
   ((vlax-property-available-p notifier-object "Area")
    (princ (strcat "\n*** The Area is "))
    (princ (vla-get-Area notifier-object))
    )
   )
 )

(Princ "\nProgrammatie : Hautekeete Olivier 18/08/2005")(princ)
(Princ "\nOm te starten typ 'RH'")(princ)
?

Johan Glasbergen

Citaat van: Kenny H

Maar dan mag je ook uw figuur niet meer wijzigen.
Als je ze wijzigt moet je opnieuw field herhalen. :wink:

Bij het wijzigen van het figuur wordt de oppervlakte in het field bijgewerkt. Het is echter niet direct zichtbaar maar pas na een “regen”. Wanneer een field moet worden bijgewerkt kan worden ingesteld in de Options op het tabblad User Preferences.

Kenny H

Merci Johan voor deze oplossing.
Ik wist niet de via regen de opp werd geupdate  :wink:
8) Volvo 4 Life 8)

TeQnologie

dit is allemaal wel erg interesant. maar niet echt wat k bedoel. want dan kan ik net zo goed gewoon area doen, object en ik weet ook de oppervlakte.

Ik zat alleen net te denken. ik geloof niet dat er zoiets is maar mischien dat dat ook gemaakt zou kunnen worden.
Met dimension dan. je klikt de rectangle aan en je kan binnen je plattegrond het aantal m² plaatsen.
Het zou trouwens ook bij een polyline moeten werken waar veel verschillende hoeken in zitten..

Ik ga nog weer even verder zoeken.. bedankt voor de reacties. als ik iets heb gevonden laat ik t ook wel weten..

thnx..

WebRacer

Heb ik dan zo een moeilijke lisp voor niets geschreven?
Die lisp kan ik aanpassen dat je de area krijgt in je rectangle...
?

Kenny H

Ik weet niet waarom werken met area of die field niet goed genoeg zijn om een oppervlakte te creëren. :roll:  :?
Wil je mij/ons dat eens uitleggen?

Bij een rechthoek, driehoek enz kun je nog makelijk de oppervlaktes laten berekenen. Maar wanneer je combinaties wilt is dat dan alweer moeilijker.
Die field en area zijn daarom ontworpen. Met die field kun je trouwens uw oppervlakte maat plaatsen :!:

Ik snap dus niet wat jij juist wil bekomen.
Wil je van een bestaande figuur de oppervlakte verkrijgen?
Of eerst de figuur tekenen met lijnen ed en dat je dan de mogelijkheid hebt om de oppervlakte daarvan te plaatsen?
8) Volvo 4 Life 8)

WebRacer

Probeer dan deze eens....

;Oppervlakte - plaatst tekst met oppervlakte van object
;Geschreven door Olivier Hautekeete
;
------------------
| Hoofdprogramma |
--------------------------------------------------------------
(defun c:Opp ()
 (variables1)
 (vl-load-com)
 (setq oAcad (vlax-get-acad-object)
   oDoc (vla-get-activedocument oAcad)
   EntNm (vlax-Ename->vla-Object (car (entsel "\nSelekteer een polyline")))
   EntAre (vla-get-area EntNm)
   opp (strcat "Opp: " (rtos EntAre 2 2) " m2"))
 (plaats_text)
 (variables2)
)
--------------------------------------------------------------
| Variables1
--------------------------------------------------------------
(defun variables1 ()
 (setq osmo (getvar "osmode"))
 (setq cmd (getvar "cmdecho"))
 (setq fil (getvar "filedia"))
 (setq diz (getvar "dimzin"))
 (setvar "osmode" 0)
 (setvar "cmdecho" 0)
 (setvar "filedia" 0)
 (setvar "dimzin" 2)
)
--------------------------------------------------------------
| Variables2
--------------------------------------------------------------
(defun variables2 ()
 (setvar "osmode" osmo)
 (setvar "cmdecho" cmd)
 (setvar "filedia" fil)
 (setvar "dimzin" diz)
)
--------------------------------------------------------------
(defun plaats_text ()
 (setq p (getpoint "\nGeef de plaats aan voor de oppervlakte... "))
 (entmake (list '(0 . "TEXT")         ;type entiteit
          (cons 10 p)      ;tekst invoegpunt
          '(40 . 2.5)      ;teksthoogte
          (cons 1 opp)      ;de tekst zelf
      )
 )
)
--------------------------------------------------------------
| Lisp-melding
--------------------------------------------------------------
(princ "\nCopyright (C) Hautekeete Olivier - augustus 2005.")(princ)
(princ "\nStart het commando met 'OPP'.")(princ)
--------------------------------------------------------------
?

TeQnologie

Citaat van: Kenny HIk weet niet waarom werken met area of die field niet goed genoeg zijn om een oppervlakte te creëren. :roll:  :?
Wil je mij/ons dat eens uitleggen?

Bij een rechthoek, driehoek enz kun je nog makelijk de oppervlaktes laten berekenen. Maar wanneer je combinaties wilt is dat dan alweer moeilijker.
Die field en area zijn daarom ontworpen. Met die field kun je trouwens uw oppervlakte maat plaatsen :!:

Ik snap dus niet wat jij juist wil bekomen.
Wil je van een bestaande figuur de oppervlakte verkrijgen?
Of eerst de figuur tekenen met lijnen ed en dat je dan de mogelijkheid hebt om de oppervlakte daarvan te plaatsen?

Ja ik was dan mischien wat onduidelijk, maar wat ik precies wil is eerst een figuur tekenen en dan inderdaad de mogelijk hebben om daarin of in mijn ernaast de oppervlakte te plaatsen..
Wat we prcecies willen: is dat we een plattegrond hebben met daarin een heleboel ruimten en daarvan willen we in een soort tabel naast de tekening alle oppevlakten aangeven binnen de tekening. sanitair, kantoor, schachten etc.

En dat is dus precies wat webracer heeft gedaan met zijn tweede LISP!!
Dit is dus precies wat ik bedoel :-D

Alleen nu heb ik nog een vraagje? wij tekenen altijd in mm en als ik dus nu de oppervlakte van een polyline heb die ik bijvoorbeeld 1000 x 1000 mm heb getekend. dan krijg ik 1000000.00 m² als ik je lisp gebruik en dit zou ik dus 1.00 m² willen hebben.
Ik heb al naar je lisp gekeken het zit ergens in dit stukje volgens mij:

EntAre (vla-get-area EntNm)
opp (strcat "Opp: " (rtos EntAre 2 2) " m2"))


real to string ken ik maar dat entare 2 2 zegt me helemaal niets :(

Erg bedankt zo leer ik ook weer wat bij :D

Kenny H

Om uw oppervlakte in M² te kijgen

Webracer heeft wel m² gezet als naam maar is vergeten dat er getekend werd in mm.

Citeer

(defun c:Opp ()
(variables1)
(vl-load-com)
(setq oAcad (vlax-get-acad-object)
oDoc (vla-get-activedocument oAcad)
EntNm (vlax-Ename->vla-Object (car (entsel "\nSelekteer een polyline")))
Entre (vla-get-area EntNm)
EntAre    (/ entre 1000000)

opp (strcat "Opp: " (rtos EntAre 2 2) " m2"))
(plaats_text)
(variables2)
)

Wat betreft die RTOS:

Citeer(rtos number [mode [precision]])

The rtos function returns a string that is the representation of number according to the settings of mode, precision, and the system variables UNITMODE, DIMZIN, LUNITS, and LUPREC.

Arguments

number

A number.

mode

An integer specifying the linear units mode. The mode corresponds to the values allowed for the LUNITS AutoCAD system variable. The mode can be one of the following numbers:

1  Scientific

2  Decimal

3  Engineering (feet and decimal inches)

4  Architectural (feet and fractional inches)

5  Fractional

precision

An integer specifying the precision.
2 cijfers na da comma  :wink:

MVG

Kenny
8) Volvo 4 Life 8)