FastFiber

kan ik instellingen (sys.var's) permanent laten tonen? (opgelost met Modemacro)

Gestart door Reimer, do 23 04 2015, 10:54:52

Vorige topic - Volgende topic

Reimer

Is het mogelijk om ergens in mijn workspace bepaalde gegevens te laten tonen. Ik zit te denken aan bijvoorbeeld de systeemvariabele PLINETYPE, deze staat nog al eens verkeerd. Op deze manier kan ik in één oogopslag zien welke instellingen actief zijn.
Voorheen stond onderin het scherm de coordinaten van je muisaanwijzer weergegeven. Deze zie ik in acad 2015 niet meer (ik mis ze niet) maar dit is wel het principe waar ik aan zit te denken. Wellicht kan het via een toolbar.

Reimer

H@rm

Ik heb zelf een routine gemaakt waarin ik heel veel systeem variabelen , aan de hand van een persoonlijk ini-bestand, na activering goed zet. Deze start ook bij het starten van een tekening. Ook handig als je tijdens een routine vast loopt o.i.d en een deel van de instellingen fout staan.

Is dat iets waar je mee geholpen zou zijn Reimer?
Acad 10 t/m 2015
Revit 2010 t/m 2015
autodidact lisp

Reimer

Dank je wel voor het aanbod, dit is echter niet nodig. Het is wel een goede oplossing, maar ik zou graag een aantal variabelen willen kunnen monitoren zeg maar.

Reimer

EddyBeerke

Misschien een lisp maken die de vars laat zien met een klik op een knop?
Je krijgt dan zo iets:


(defun c:Toonvars ()
  (alert
    (strcat "Sysyteem variablen: \n\n Huidige Workspace: "(getvar "WSCURRENT") "\n PLinetype: " (itoa (getvar "PLINETYPE"))))
  (princ)
)


En als je deze tijdens het laden van AutoCAD, bij het openen van een bestaande tekening of een nieuwe tekening wil aanroepen kun je dit in een lisp stoppen die je in je startup zet:

(princ (strcat "Sysyteem variablen: \n\n Huidige Workspace: "(getvar "WSCURRENT") "\n PLinetype: " (itoa (getvar "PLINETYPE"))))(princ)
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

roy_043

Je kunt gebruikmaken van de (grtext) functie in combinatie met reactors om info in de status line weer te geven.
Voorbeeld:
(defun SysVarStatus_OnLoad ()
  (if *SysVarStatus_acdbReactor*   (vlr-remove *SysVarStatus_acdbReactor*))
  (if *SysVarStatus_sysvarReactor* (vlr-remove *SysVarStatus_sysvarReactor*))
  (setq *SysVarStatus_acdbReactor* ; This will fire very often.
    (vlr-acdb-reactor
      nil
      '((:vlr-objectmodified . SysVarStatus_CallBack))
    )
  )
  (setq *SysVarStatus_sysvarReactor*
    (vlr-sysvar-reactor
      nil
      '((:vlr-sysvarchanged . SysVarStatus_CallBack))
    )
  )
  (SysVarStatus_CallBack nil nil)
  (princ "\nSysVarStatus is running ")
  (princ)
)

;;; ======================================================================
;;; Function:     SysVarStatus_CallBack
;;; Arguments:    rea - Vlr-object.
;;;               lst - Data list:
;;;                       For vlr-acdb-reactor:
;;;                         Length 2: database object and entity as ename.
;;;                       For vlr-sysvar-reactor:
;;;                         Length 2: sysvar name and T/nil.
;;; ======================================================================
(defun SysVarStatus_CallBack (rea lst / ss obj)
  (grtext -1 (strcat "OSMODE=" (itoa (getvar 'osmode))))
)

(SysVarStatus_OnLoad) ; Starts the reactors.

EddyBeerke

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

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

HofCAD

Citaat van: Reimer op do 23 04 2015, 10:54:52
Voorheen stond onderin het scherm de coordinaten van je muisaanwijzer weergegeven. Deze zie ik in acad 2015 niet meer (ik mis ze niet) maar dit is wel het principe waar ik aan zit te denken. Wellicht kan het via een toolbar.

Reimer
Beste Reimer,

De mogelijkheid voor coordinaten weergave in AutoCAD 2015 is niet weg!

http://help.autodesk.com/view/ACDLTM/2015/ENU/?guid=GUID-8E3F0C5A-ED83-4DD4-8AE6-FC1CE54533F6


Met vriendelijke groet, HofCAD CSI.
ACADcadabra

roy_043

Verbeterde versie van mijn code:
(defun SysVarStatus_OnLoad ()
  (if *SysVarStatus_commandReactor*    (vlr-remove *SysVarStatus_commandReactor*))
  (if *SysVarStatus_docmanagerReactor* (vlr-remove *SysVarStatus_docmanagerReactor*))
  (if *SysVarStatus_sysvarReactor*     (vlr-remove *SysVarStatus_sysvarReactor*))
  (setq *SysVarStatus_commandReactor* ; Required for BricsCAD V14.2.17: The documentToBeDeactivated event is nor triggered when a dwg is opened.
    (vlr-command-reactor
      nil
      '((:vlr-commandended . SysVarStatus_CallBackCommand))
    )
  )
  (setq *SysVarStatus_docmanagerReactor*
    (vlr-docmanager-reactor
      nil
      '(
        (:vlr-documenttobeactivated . SysVarStatus_CallBackDisplay)
        (:vlr-documenttobedeactivated . SysVarStatus_CallBackClear)
      )
    )
  )
  (setq *SysVarStatus_sysvarReactor*
    (vlr-sysvar-reactor
      nil
      '((:vlr-sysvarchanged . SysVarStatus_CallBackDisplay))
    )
  )
  (SysVarStatus_CallBackDisplay nil nil)
  (princ "\nSysVarStatus is running ")
  (princ)
)

(defun SysVarStatus_CallBackDisplay (rea lst)
  (grtext -1 (strcat "OSMODE=" (vl-princ-to-string (getvar 'osmode))))
)

(defun SysVarStatus_CallBackClear (rea lst)
  (grtext -1 "")
)

(defun SysVarStatus_CallBackCommand (rea lst)
  (if (vl-position (car lst) '("NEW" "OPEN" "QNEW"))
    (grtext -1 "")
  )
)

(SysVarStatus_OnLoad) ; Starts the reactors.

Reimer

@EddyBeerke; het gaat mij voornamelijk om PLINETYPE, maar ik FILEDIA wil ik soms in de gaten houden.

@HofCAD; bedankt. Dit had ik over het hoofd gezien.

@Roy_043; dit werkt geweldig. Helaas voor mij nog niet geheel te snappen wat er gebeurt. Is het veel gevraagd om een kleine toelichting bij de regels te geven?
Om meerdere variabelen te tonen heb ik het volgende bedacht:
(grtext -1 (strcat "PLTYPE=" (vl-princ-to-string (getvar 'plinetype)) " | FDIA=" (vl-princ-to-string (getvar 'filedia))))

Reimer


Reimer

Bedankt Julien, ik had hier al over gelezen. Vanaf R2016 bevat acad een 'System Variable Monitor'. Je kunt opgeven welke variabelen je wilt monitoren. Zodra er een wijzigd krijg je een melding. Helaas zal het nog wel even duren voordat wij R2016 krijgen.  :(

Reimer

EddyBeerke

Citaat van: Reimer op di 28 04 2015, 08:13:18

Om meerdere variabelen te tonen heb ik het volgende bedacht:
(grtext -1 (strcat "PLTYPE=" (vl-princ-to-string (getvar 'plinetype)) " | FDIA=" (vl-princ-to-string (getvar 'filedia))))

Reimer


Misschien is dit iets:
(setvar "MODEMACRO"
    (strcat "PLineType: $(getvar,PLINETYPE)"
         ",  FDIA: $(getvar,FILEDIA)"))


Als je dit gebruikt en er is een verandering dan zie je het gelijk.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

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

Reimer

Interessant. De optie van EddyBeerke geeft precies hetzelfde resultaat als die van Roy.
Modemacro overruled echter wel de code van Roy. Modemacro wordt niet bewaard maar is evengoed in een standaard lisproutine mee te nemen.

Reimer

roy_043

#13
@ Eddy: Dat is vanzelfsprekend veel handiger! :vreegoe:

Hieronder mijn, opnieuw verbeterde, code met wat toelichting:
(defun SysVarStatus_OnLoad ()
  ;; Reactors die actief zijn worden verwijderd. Dit is nodig als de code meerdere keren wordt
  ;; uitgevoerd in dezelfde tekening.
  (if *SysVarStatus_sysvarReactor*     (vlr-remove *SysVarStatus_sysvarReactor*))
  (if *SysVarStatus_docmanagerReactor* (vlr-remove *SysVarStatus_docmanagerReactor*))
  (if *SysVarStatus_commandReactor*    (vlr-remove *SysVarStatus_commandReactor*))
  ;; Om sysvars te volgen is een vlr-sysvar-reactor nodig. Als een sysvar gewijzigd is, wordt de
  ;; 'callback' uitgevoerd. Overigens kunnen niet alle sysvars op deze manier gevolgd worden.
  (setq *SysVarStatus_sysvarReactor*
    (vlr-sysvar-reactor
      nil ; Geen data.
      '(
        (:vlr-sysvarchanged . SysVarStatus_CallBackDisplay)
      )
    )
  )
  ;; Sysvars kunnen per tekening verschillen. Ook kan het zijn dat in een tekening deze code niet is
  ;; geladen. Daarom moeten twee dingen worden geregeld. Als een tekening wordt gedeactiveerd dan
  ;; moet de status-tekst worden verwijderd. Gebeurt het omgekeerde dan moet de status-tekst weer
  ;; verschijnen. Hiervoor wordt een vlr-docmanager-reactor gebruikt.
  (setq *SysVarStatus_docmanagerReactor*
    (vlr-docmanager-reactor
      nil ; Geen data.
      '(
        (:vlr-documenttobeactivated . SysVarStatus_CallBackDisplay)
        (:vlr-documenttobedeactivated . SysVarStatus_CallBackClear)
      )
    )
  )
  ;; Vreemd genoeg heeft het openen van een tekening geen :vlr-documenttobedeactivated gebeurtenis
  ;; tot gevolg in BricsCAD V14.2.17. Een vlr-command-reactor wordt gebruikt als workaround. Voor de
  ;; workaround is tevens een globale variabele nodig: *sysVarStatus_monitorCommandEnd_P*. De
  ;; :vlr-commandended gebeurtenis treedt namelijk eerst op in de 'oude' maar daarna ook in de
  ;; 'nieuwe' tekening (als deze code wordt geladen natuurlijk). In het eerste geval moet de status-
  ;; tekst worden verwijderd. In het tweede geval niet.
  (setq *SysVarStatus_commandReactor*
    (vlr-command-reactor
      nil ; Geen data.
      '(
        (:vlr-commandwillstart . SysVarStatus_CallBackCommandStart)
        (:vlr-commandended . SysVarStatus_CallBackCommandEnd)
      )
    )
  )
  ;; De genoemde globale variabele wordt op nil gezet.
  (setq *sysVarStatus_monitorCommandEnd_P* nil)
  ;; De status-tekst wordt gevuld.
  (SysVarStatus_CallBackDisplay nil nil)
  (princ "\nSysVarStatus is running ")
  (princ)
)

(defun SysVarStatus_CallBackDisplay (rea lst)
  (grtext -1 (strcat "OSMODE=" (vl-princ-to-string (getvar 'osmode))))
)

(defun SysVarStatus_CallBackClear (rea lst)
  (grtext -1 "")
)

(defun SysVarStatus_CallBackCommandStart (rea lst)
  (if (vl-position (car lst) '("NEW" "OPEN" "QNEW"))
    (setq *sysVarStatus_monitorCommandEnd_P* T)
  )
)

(defun SysVarStatus_CallBackCommandEnd (rea lst)
  (if
    (and
      ;; Verwijder de status-tekst alleen als het commando in dezelfde tekening is gestart:
      *sysVarStatus_monitorCommandEnd_P*
      (vl-position (car lst) '("NEW" "OPEN" "QNEW"))
    )
    (progn
      (setq sysVarStatus_monitorCommandEnd_P nil)
      (grtext -1 "")
    )
  )
)

(SysVarStatus_OnLoad) ; De reactors worden gestart.

FastFiber