FastFiber

Geheugenfunctie in LISP commando bij wijzigen waarde, in geopende tekening.

Gestart door Vonk, wo 02 03 2016, 15:53:43

Vorige topic - Volgende topic

Vonk

Hierbij een goed werkende LISP voor hoeveelheden welke we gebruiken in gevel/dakoverzichten
Bij starten commando vraagt hij de werkende maat vooraf ingesteld op 930. Zie in rood aangegeven.
En horizontaal of verticaal (H of V, standaard H)zie in rood aangegeven.
Is er een LISP functie die ik aan het (zie rode geselecteerde tekst) toe kan voegen. die mijn laatste ingevoerde waarde onthoudt. Dus als 930 bijvoorbeeld wijzigt in 1000. Hij de waarde 1000 weer laat zien bij herladen commando in dezelfde tekening?
Hoop dat zoiets bestaat zodat ik niet steeds een afwijkende waarde in moet vullen maar hij dit dus in de tekening onthoud bij opnieuw starten van het commando.
Alvast bedankt voor meedenken/meekijken  :D

;Bepaling van de steekmaat
(defun steekmaat()

        (setq werk (getreal"\nGeef de werkende breedte van de dakplaat <930>:"))
                (if (= werk nil)
                (setq werk 930)

                )
  )




;Bepaling van de aantalen
(defun aantalbep ()
                (princ werk)
                (setq aantal    (abs (/ afst werk)))
                (setq aantals   (rtos aantal 2 1))
                (setq aantals   (atof aantals))
                (setq aantal1   (fix aantal))                           ;maakt van realgetal een string
                (setq verschil  (- aantals aantal1))
                (if (=  verschil 0)
                        (progn
                        (setq aantal7 0)                                             
                        (setq aantal4 (rtos (+ aantal1 aantal7) 2 0))
                        (setq aantal2 (fix (atof aantal4)))
                        )
                                (if (and (>  verschil 0)
                                         (<= verschil 0.5)
                                    )
                                        (progn
                                        (setq aantal7 0.5)
                                        (setq aantal2 (rtos (+ aantal1 aantal7) 2 1))
                                        )
                                                        (progn
                                                        (setq aantal7 1)
                                                        (setq aantal4 (rtos (+ aantal1 aantal7) 2 0))
                                                        (setq aantal2 (fix (atof aantal4)))
                                                        )
                                )
                )               
)

(defun daplh ()
        (setq ant "")
        (while (= ant "")
   (if (= (setq schaal (getvar "USERR1")) 0.0) (setq schaal 1)) ; als USERR1 niet is ingevuld, dus 0.0, vul dan schaal met 1 of een andere gewenste waarde
        (command "layer" "s" "0.35" "")
        (setq p1 (getpoint"\nWijs linker onderhoek aan:"))
        (setq p2 (getpoint"\nWijs rechter bovenhoek aan:"))

        (command "line" p1 p2 "")
        (setq lijn (entlast))
                (setq enti (entget lijn))
                (setq begin (cdr (assoc 10 enti)))
                (setq eind (cdr (assoc 11 enti)))
                (setq hoek (angle begin eind))
                (setq hoek1 (/(* hoek 360)(* 2 pi)))
                        (if (>= hoek1 90)
                                (setq hoek1 (- hoek1 180))
                        )
                (setq by1 (cadr begin))
                (setq bx1 (car begin))
                (setq ey1 (cadr eind))
                (setq ex1 (car eind))
                (setq x1 (/ (+ ex1 bx1) 2))
                (setq y1 (/ (+ ey1 by1) 2))
                (setq mid (list x1 y1))

               
                (setq afst (- ey1 by1))
                (aantalbep)
               
               
                (setq lengte (- ex1 bx1))
                (setq lengte1 (rtos lengte 2 0))
                (setq lengte2 (fix (abs (atof lengte1))))
               
               
                (command "insert" "dplaat" mid schaal "" hoek1 aantal2 lengte2 "")
                (setq ant "")
)
;(princ)
(setvar "cmdecho" cmde)
)

(defun daplv ()
        (setq ant "")
        (while (= ant "")
        (if (= (setq schaal (getvar "USERR1")) 0.0) (setq schaal 1)) ; als USERR1 niet is ingevuld, dus 0.0, vul dan schaal met 1 of een andere gewenste waarde
        (command "layer" "s" "0.35" "")
       
        (setq p1 (getpoint"\nWijs linker onderhoek aan:"))
        (setq p2 (getpoint"\nWijs rechter bovenhoek aan:"))
        (command "line" p1 p2 "")
        (setq lijn (entlast))
                (setq enti (entget lijn))
                (setq begin (cdr (assoc 10 enti)))
                (setq eind (cdr (assoc 11 enti)))
                (setq hoek (angle begin eind))
                (setq hoek1 (/(* hoek 360)(* 2 pi)))
                        (if (>= hoek1 90)
                                (setq hoek1 (- hoek1 180))
                        )
                (setq by1 (cadr begin))
                (setq bx1 (car begin))
                (setq ey1 (cadr eind))
                (setq ex1 (car eind))
                (setq x1 (/ (+ ex1 bx1) 2))
                (setq y1 (/ (+ ey1 by1) 2))
                (setq mid (list x1 y1))

               
                (setq afst (- ex1 bx1))
                (aantalbep)
               
               
                (setq lengte (- ey1 by1))
                (setq lengte1 (rtos lengte 2 0))
                (setq lengte2 (fix (abs (atof lengte1))))
               
               
                (command "insert" "dplaat" mid schaal "" hoek1 aantal2 lengte2 "")
                (setq ant "")
)
;(princ)
(setvar "cmdecho" cmde)
)
               

(defun c:dapl ()
   (princ "* BEPAALT AANTAL EN LENGTE DAKPLATEN")(terpri)
   (terpri)
   (setvar "cmdecho" 0)
        (setvar "attdia" 0)
     (steekmaat)
        (setq k (getstring"\n<H>orizontaal of <V>ertikaal <H>:"))

                (if (= k "")
                (setq k "h")
                )
                (if (= k "h")
                        (progn
                        (daplh)
                        )
                        (progn
                        ;(princ)
                        )
                )
                (if (= k "v")
                        (progn
                        (daplv)
                        )
                        (progn
                        ;(princ)
                        )
                )
)

EddyBeerke

Je zou de waarde in je tekening kunnen opslaan door de var USERR1 te gebruiken.
Misschien zo iets?

(setq werk (getvar "userr1"))
(if (= werk 0) (setq werk 930))
(setq werk (getreal (strcat "\nGeef de werkende breedte van de dakplaat <" (rtos werk) ">:")))
(setvar "USERR1" werk)

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

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

Vonk

Dag Eddy,

Bedankt voor je reactie!
Ik heb de code op de plaats van de rode tekst gezet
maar dan werkt het niet. Het commando kent acad na het loaden van de lisp(dapl) niet meer
en krijg het niet geladen.
Heb de code geprobeerd met en zonder de 2 gesloten haakjes eronder.

Als optie;
Bij het toevoegen van je code onder de rode tekst (als aanvulling)... loopt acad vast.
Dus dat is niet de juiste manier.

Helaas is mijn kennis van LISP niet genoeg om het probleem te zien.




sschevers

Variable "userr1" wordt al gebruikt binnen je functies (zie daplh en daplv). En overschrijft dus je waarde die je graag wilt hebben.

Als je ipv userr1 userr2 gebruikt zou het moeten werken

stephan

Reimer

Beste Vonk,

omdat userr1 of userr2 ook door andere lisp-routine kunnen worden gebruikt zou ik er zelf voor kiezen om de waarde voor "werk" in een eigen variabele op te slaan. Deze waarde wordt in de lopende sessie bewaard in de actieve tekening. Als je de tekening afsluit wordt de waarde gewist en na het opnieuw openen moet de waarde éénmalig worden opgegeven.
Vervang de functie "steekmaat":
(defun steekmaat()
        (setq werk (getreal"\nGeef de werkende breedte van de dakplaat <930>:"))
                (if (= werk nil)
                (setq werk 930)
                )
  )


door mijn funtie voor "steekmaat" (de werkende breedte wordt in de tekening bewaard in de variabele DAPLWERK):
(defun steekmaat ()
  (if (= (numberp DAPLWERK) nil)
    (setq DAPLWERK 930)
  );           Als DAPLWERK geen nummer is vul dan 930 in.
  (setq werk (getreal (strcat "\nGeef de werkende breedte van de dakplaat <" (rtos DAPLWERK) " >: ")))
  (if (= werk nil)
    (setq werk DAPLWERK);           als voor WERK niets is opgegeven gebruik dan de waarde van DAPLWERK
    (setq DAPLWERK werk);           als voor WERK een getal is opgegeven bewaar deze dan in DAPLWERK
  )
)

Vonk

Beste Reimer,
HET WERKT :D
Bij een enter pakt hij automatisch het getal 930 en bij het wijzigen naar bijv <750> werkt het
ook bij een enter, zonder opnieuw in te hoeven in voeren. TOP.

Bij de formule van Eddy met een aanpassing van userr1 naar userr2(bedankt sschevers)
werkte het geheugen van invoergetal '' werk'' ook. Maar.... moest ik toch de invoer nogmaals doen ondanks het vooraf ingestelde <930> of het gewijzigde <750>. Bij een enter stopte de formule namelijk.
Dus uiteindelijk geen voordeel, anders dan je zag wat het laatst ingevoerde getal was.

Om de formule nu compleet te maken zou ik dit ook graag
willen toepassen in het 2e rode geselecteerde uit mijn tekst.
De keuze <H>horizontaal of <V> verticaal.
Zou fijn zijn als je er naar wil kijken Reimer.
Bedankt

bart

Je slaat de variabele nu op in de tekening op zich kan dat handig zijn maar is dit ook nodig?
als je een globale variabele gebruikt (alle variable in jouw lisp zijn globaal) onthoud autocad deze ook binnen 1 teken sessie.
Ik zal hiervan even een voorbeeldje opzoeken.

Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

bart

bij het eerste gebruik zijn beide variabele nog nil
gebruik een extra variable om de waarde op te slaan en de magelijkheid in te bouwen om de maat te wijzigen
bij het tweede gebruik kan je met enter voor de eerder ingegeven waarde kiezen of een nieuwe maat ingeven.
de eventueel nieuw ingegeven waarde wordt voor het volgende gebruik opgeslagen

(setq var1 var2)
(princ                  "\ngeef een Maat ................................[mm]: ")
(princ (list var1))
(setq var2 (getreal "\ "))
(if (null var2) (setq var2 var1)
(setq var1 var2))
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

PeterDe

Kan een variabele bewaard worden in de DWG zodat die ook door andere gebruikers kan gebruikt worden? zonder gebruik te maken van USERR... en USERSS.... ?

roy_043

Citaat van: PeterDe op di 08 03 2016, 08:41:21
Kan een variabele bewaard worden in de DWG zodat die ook door andere gebruikers kan gebruikt worden? zonder gebruik te maken van USERR... en USERSS.... ?
Dat kan door gebruik te maken van dictionaries.

PeterDe

Mijn lisp kennis is nogal beperkt, als ik naar dictionary kijk merk ik dat het vooral gaat over toekennen van "objecten" aan aan dictionary.
Kan je een voorbeeld geven waarbij volgende aan een dictionary kan toegevoegd worden: variabele Criteria1 = 0,82 en variabele Mat1 = "PLA3"

bart

Je kan ook de waarde die je wilt bewaren wegschrijven in een attribute (block)
Deze kan je op onzichtbaar instellen en bijvoorbeeld toe te voegen aan je onderhoek.

De lips moet je dan uitbreiden met een paar regels om de waarde uit te lezen en weg te schrijven.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

roy_043

Citaat van: PeterDe op di 08 03 2016, 12:11:43
Mijn lisp kennis is nogal beperkt, als ik naar dictionary kijk merk ik dat het vooral gaat over toekennen van "objecten" aan aan dictionary.
Kan je een voorbeeld geven waarbij volgende aan een dictionary kan toegevoegd worden: variabele Criteria1 = 0,82 en variabele Mat1 = "PLA3"
Typisch bevatten dictionaries andere dictionaries en/of Xrecords. De records op hun beurt bevatten data. Zeer complexe structuren zijn mogelijk.

In de onderstaande code is gekozen deze zeer eenvoudige opzet:
Main dictionary (namedobjdict) -> Sub dictionary -> Xrecord met slechts 1 gegeven (string, real of integer).

(vl-load-com)

; Dict: Naam dictionary.
; Rec:  Naam record.
; Val:  Waarde. Moet een string, real of integer zijn.
; (DictSingleValueSet "MijnVariabelen" "MijnTekst" "ABC")
(defun DictSingleValueSet (dict rec val / typ)
  (vla-setxrecorddata
    (vla-addxrecord
      (vla-add
        (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
        dict
      )
      rec
    )
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbinteger '(0 . 0))
      (list
        (cond
          ((= 'str (setq typ (type val)))  1)
          ((= 'real typ)                  40)
          ((= 'int typ)                   90)
        )
      )
    )
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbvariant '(0 . 0))
      (list (vlax-make-variant val))
    )
  )
  val
)

; Dict: Naam dictionary.
; Rec:  Naam record.
; (DictSingleValueGet "MijnVariabelen" "MijnTekst")
(defun DictSingleValueGet (dict rec / val)
  (if
    (not
      (vl-catch-all-error-p
        (vl-catch-all-apply
          '(lambda ( / keyLst valLst)
            (vla-getxrecorddata
              (vla-item
                (vla-item
                  (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
                  dict
                )
                rec
              )
              'keyLst
              'valLst
            )
            (setq val (vlax-variant-value (car (vlax-safearray->list valLst))))
          )
          nil
        )
      )
    )
    val
  )
)


roy_043

... Hieronder de 'klassieke' versie van de functies uit mijn vorige bericht:
; Dict: Naam dictionary.
; Rec:  Naam record.
; Val:  Waarde. Moet een string, real of integer zijn.
; (Classic_DictSingleValueSet "MijnVariabelen" "MijnTekst" "ABC")
(defun Classic_DictSingleValueSet (dict rec val / dictEnme)
  (setq dictEnme
    (cond
      ((cdr (assoc -1 (dictsearch (namedobjdict) dict))))
      ((dictadd (namedobjdict) dict (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary")))))
    )
  )
  (dictremove dictEnme rec)
  (dictadd
    dictEnme
    rec
    (entmakex
      (list
        '(0 . "XRECORD")
        '(100 . "AcDbXrecord")
        (cons
          (cond
            ((= 'str (setq typ (type val)))  1)
            ((= 'real typ)                  40)
            ((= 'int typ)                   90)
          )
          val
        )
      )
    )
  )
  val
)

; Dict: Naam dictionary.
; Rec:  Naam record.
; (Classic_DictSingleValueGet "MijnVariabelen" "MijnTekst")
(defun Classic_DictSingleValueGet (dict rec / dictEnme recElst)
  (if
    (and
      (setq dictEnme (cdr (assoc -1 (dictsearch (namedobjdict) dict))))
      (setq recElst (dictsearch dictEnme rec))
    )
    (cdadr (member (assoc 280 recElst) recElst))
  )
)

EddyBeerke

Raar... Bij mij werkte het wel...
Zal proberen de lisp compleet te maken en hier te posten.. Maar zal voor een rustige dag zijn... Misschien deze week???

Verstuurd vanaf mijn LG-E975 met Tapatalk

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

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