FastFiber

systemvariables van viewport kloppen niet met de werkelijkheid

Gestart door delangstevandestraat, vr 27 05 2016, 11:46:40

Vorige topic - Volgende topic

delangstevandestraat

Ik heb een routine die de titelhoek van een tekening automatisch aanpast, wanneer een tekening groter of kleiner word, (bvb A4-hoogte breedte 1000mm en die moet verbreden)

Dit werkt allemaal goed, echter in bestaande tekeningen loopt het soms fout,

ik heb de oorzaak ondertussen gevonden, echter de oplossing werkt niet via lisp.

als ik de tekening bekijk en de properties van de VP bekijk dan staan deze fout, de center x en center y waarde zijn fout, de width wordt soms zelfs als negatief getoond,

als ik een regen doe dan komt dit goed, echter, als ik via lisp een regen doe dan worden deze waarden niet aangepast in de sysvar's VIEWCTR...

de vraag : hoe krijg ik de juiste waarden in VIEWCTR via lisp-code ?

Het echte vreemde aan de gehele zaak is dat ook al heeft de tekening verschillende layouts, als ik de routine er op los laat, dan staat de positionering van de aangepaste VP fout, die PAN ik dan weer op de juiste plaats,
en in alle andere layouts doet de routine het goed, Het loopt dus maar één keer fout per tekening
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

Zonder code is jouw beschrijving onduidelijk. Maar volgens mij haal je twee dingen door elkaar. VIEWCTR is niet de center property van een viewport. Je kunt dit gemakkelijk controleren door in een PS layout meerdere viewports te creëren. Elke VP heeft een eigen center, terwijl de VIEWCTR één waarde heeft (in PS bij een gelijke view uitsnede).

gery

Citaat van: roy_043 op zo 29 05 2016, 11:05:56Elke VP heeft een eigen center, terwijl de VIEWCTR één waarde heeft (in PS bij een gelijke view uitsnede).
Ik heb dit net getest en in mijn tekening heeft elke viewport wel degelijk een andere VIEWCTR waarde.
AutoCAD 2020 - Windows 10

gery

Citaat van: delangstevandestraat op vr 27 05 2016, 11:46:40ik heb de oorzaak ondertussen gevonden, echter de oplossing werkt niet via lisp.
En de oorzaak is ...?

Citaat van: delangstevandestraat op vr 27 05 2016, 11:46:40hoe krijg ik de juiste waarden in VIEWCTR via lisp-code ?
VIEWCTR is read-only, dus die kan je zelf niet schrijven. In LISP kan je die uitlezen via (getvar "viewctr")

PS: het totale verhaal is me niet helemaal duidelijk.
AutoCAD 2020 - Windows 10

bart

Misschien moet je eerst zorgen dat de juiste viewport actief is.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

gery

AutoCAD 2020 - Windows 10

roy_043

Citaat van: gery op zo 29 05 2016, 11:16:56
Ik heb dit net getest en in mijn tekening heeft elke viewport wel degelijk een andere VIEWCTR waarde.
Op basis van originele vraag ('als ik ... de properties van de VP bekijk') ga ik uit van een PS situatie (zonder actieve VP). Ik heb dit ook vermeld in mijn vorige bericht:
Citaat van: roy_043 op zo 29 05 2016, 11:05:56...  (in PS bij een gelijke view uitsnede).


gery

Citaat van: delangstevandestraat op vr 27 05 2016, 11:46:40als ik de tekening bekijk en de properties van de VP bekijk dan staan deze fout, cd center x en center y waarde zijn fout, de width wordt soms zelfs als negatief getoond
Bedoelt u de coördinaten zoals in bijlage?
AutoCAD 2020 - Windows 10

delangstevandestraat

#9
@roy : inderdaad gerelateerd, het vorige topic is opgelost, ik heb een routine geschreven "changeframe" die het titehoekkader opnieuw tekent, beetje breder of beetje smaller al naar gelang de wens.
(in het kort :  ik meet de buitenkant van het bestaande frame, doe daar 105 mm +/- en teken een nieuw frame Dan meet ik het nieuwe kader opnieuw, ik vraag de waarden van de VP op (VIEWCTR,VIEWTWIST,VIEWHEIGHT)
ik bereken ook hiervan de buitenhoeken en doe daar ook van af/bij en maak een nieuwe VP op een nieuw PSPACE centerpunt zodat deze nieuwe VP mooi op het nieuw frame past.

Dit werkt bijna altijd...

Ik heb nu namelijk een tekening (niet door mij samengesteld, met een fout erin). In deze tekening werkt mijn routine changeframe ook goed behalve dat de eerste keer dat ik het doe op een 'gedraaide pagina' (2,3,4,..) wordt de VP door de routine op een verkeerde plaats gezet, dit wordt maar één keer fout gedaan, als je dan de VP activeert en PAN naar de juiste positie, dan terug PSPACE dan verloopt alles altijd goed,

@gery : ja inderdaad die coordinaten staan blijkbaar fout, denk ik toch, want als ik de VP activeer  dan zou het midden van de VP hiermee moeten overeenstemmen en dat is niet het geval, ik weet ook dat er in de tekening een 'named UCS' AFDRUK gebruikt wordt, maar aangezien het maar ééén keer fout verloopt...


op zich is dit geen groot probleem, echter deze routine zal verdeeld worden onder de collega's en het zou mooier zijn als het altijd zou werken ;-)


Ik heb de tekening bijgevoegd en de routines bijgevoegd,

hopelijk is het op deze manier allemaal een beetje duidelijker,
de routines drawbox (voor het voorblad, met een groot titelhoek)
routine drawboxsmall (voor alle volgende bladen)
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

Jouw code is zeer moeilijk leesbaar. Het vergt teveel moeite om e.e.a. te ontcijferen.
Maar wat mij wel opvalt is dat je geen rekening houdt met het feit dat de VIEWCTR wordt uitgedrukt in het huidige UCS. Probeer deze variabele daarom uit te lezen nadat je het UCS hebt verdraaid.

I.i.g. moet duidelijk zijn dat de VIEWCTR van de active VP niet gelijk is aan de center property van diezelfde VP. Slechts op de 'blad01' layout lijkt dit het geval te zijn maar dit berust op een toeval.

roy_043

... Om een punt te vertalen naar een ander coördinatensystemen kun je de trans functie gebruiken.

roy_043

... Het lijkt mij problematisch dat VP overrides verloren gaan.

delangstevandestraat

#13
oei, ik dacht nochthans ik veel commentaar plaatste ;-(

niet alle code moet je snappen hé,... zolang het doet wat het moet... maar als je me zegt waar je vast raakt praat ik je er anders wel door heen hoor ;-)

het gaat eigenlijk enkel over de code hieronder :
TER info : lm/blockboundingbox is een stukje code van LeeMac en geeft de vier hoekpunten van de ent terug in een lijstje, ik haal daar de linksonderpunt en de rechtsbovenpunt uit en daarmee teken ik een nieuwe vp op basis  ctr en height en twist van bestaande VP


  (if (= vpincl 1)
                  (progn ;2
                    (setq selset (ssget "x" (list (cons 410 (getvar "ctab")) (cons 2 "tbm_KS*")))) ;selectieset van bestaande kader pag 1
                    (setq ent (ssname selset 0)) ;eerste (enige) block uit de SS
                    (setq BS (LM:blockboundingbox (vlax-ename->vla-object ent))) ;buitenhoeken opvragen
                    (setq vplopx (+ (car (car BS)) 10) vplopy (+ (cadr (car BS)) 10) ;viewport kader opstellen
                          vprbpx (- (car (caddr BS)) 210) vprbpy (- (cadr (caddr BS)) 10) ;viewport kader opstellen
                          vplop  (list vplopx vplopy 0.0) vprbp  (list vprbpx vprbpy 0.0)) ;viewport kader opstellen
                    (setq vpselset (ssget "x" (list (cons 410 (getvar "ctab")) (cons 0 "VIEWPORT")))) ;oud viewport selecteren
                    (command "mspace")
    (setq vpctr (getvar "viewctr") ;viewport instellingen ophalen
                          vpctrx (car vpctr) vpctry (cadr vpctr)
                          vpctrx (+ vpctrx (* chgxfactor 52.5)) vpctry (+ vpctry (* chgyfactor 74.25)) ;nieuwe viewport bepalen
                          vpctr (list vpctrx vpctry 0.0)
                          vpheight (getvar "viewsize"))
                    (setq vptwist (getvar "viewtwist"))
                    (command "pspace")
                    (command "erase" vpselset "") ;oude weg
            (command "mview" vplop vprbp) ;nieuwe in de plaats
                    (command "mspace")
                      (if (/= vptwist 0.0) (command "ucs" "w" "ucs" "z" 270 "plan" "c" "zoom" "s" "1xp"))
                    (command "_zoom" "c" vpctr vpheight)
                    (command "pspace")
          ) ;end 2
                ) 




CiteerSlechts op de 'blad01' layout lijkt dit het geval te zijn maar dit berust op een toeval.

idd : de fout gebeurt alleen bij "gedraaide" bladen dus geen toeval ...

en wat bedoel je met vp overrides ?
ik vind het vreemd dat de waarden (in het properties venster)
niet overeenkomen met de effectieve waarden (in statusbalk) van de muispositie als je het center van de vp (in mspace) aanwijst
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

Citaat van: delangstevandestraat op di 31 05 2016, 11:10:21
idd : de fout gebeurt alleen bij "gedraaide" bladen dus geen toeval ...
Als je de VP op 'blad01' verplaatst dan wijzigt de center property van de VP maar niet de VIEWCTR (als je de VP weer actief maakt). Dus het verband dat jij meent te zien is toch echt op een toeval gebaseerd.

Ik heb in een vorig bericht het probleem al geïdentificeerd:
De VIEWCTR wordt uitgedrukt in het huidige UCS en jouw code houdt hiermee geen rekening. De VIEWCTR wordt bepaald in het UCS van de oude VP en vervolgens onvertaald gebruikt in het UCS van de nieuwe VP. Dit gaat alleen goed als het oude en nieuwe UCS gelijk zijn.

Je kunt per VP lagen bevriezen en ook per VP laageigenschappen wijzigen. Dit worden 'VP overrides' genoemd. Doordat je een nieuwe VP maakt gaan deze instellingen verloren.

Ook is het vreemd dat jouw code maar met 2 'twist' hoeken rekening houdt.

FastFiber