yoin

marcelmaas

#15
CiteerGeef wat meer achtergrondinformatie:
In dezelfde tekening of in verschillende tekeningen? Tegelijkertijd? Schaalafhankelijk?

We willen in een tekening op de laag "HCKP_SONOREX" een polylijn kunnen tekenen die de linetype hidden2 heeft, en tegelijk in dezelfde tekening soms op dezelfde laag een polylijn met een linetype hidden.

Dus met de lisp willen we een polylijn tekenen die als linetype hidden2 heeft, en zo dat we die kunnen zelf handmatig kunnen omzetten naar hidden als dat nodig is.

roy_043

Jouw lege tekening is allerminst leeg. De tekening bevat een complete lagenstructuur. Het programma van HofCAD kijkt of de laag "HCKP_SONOREX" al bestaat en alleen als dat niet zo is wordt de laag met het juiste lijntype aangemaakt. Bestaat de laag al wel dan wordt deze slechts geactiveerd. En dat is natuurlijk een zinnige programmastructuur.

Uit het feit dat alle lagen in de lege tekening het lijntype continuous hebben, concludeer ik dat jullie hebben besloten om het lijntype vast te leggen op het niveau van de entiteiten. In veel bedrijven is dat principieel verboden, maar dat terzijde.

Mijn nieuwe lisp:
(defun c:PL40 ( / oldCeltype oldCelweight oldClayer oldPlinewid lay lType)
  (setq oldCeltype (getvar 'celtype))
  (setq oldCelweight (getvar 'celweight))
  (setq oldClayer (getvar 'clayer))
  (setq oldPlinewid (getvar 'plinewid))
  (setq lay "HCKP_SONOREX")
  (setq lType "HIDDEN2")
  (setvar 'cmdecho 0)
  (if (not (tblsearch "LAYER" lay))
    (vl-cmdf "_.layer" "_new" lay "")
  )
  (vl-cmdf
    "_.layer"
    "_on"      lay
    "_thaw"    lay
    "_unlock"  lay
    "_color"   4     lay ; deze regel eventueel weglaten
    "_ltype"   lType lay ; deze regel eventueel weglaten
    "_lweight" 0.25  lay ; deze regel eventueel weglaten
    ""
  )
  (if (not (tblsearch "LTYPE" lType))
    (vl-cmdf "_.linetype" "_load" lType "" "")
  )
  (setvar 'cmdecho 1)
  (setvar 'celtype lType)
  (setvar 'celweight -1)
  (setvar 'clayer lay)
  (setvar 'plinewid 40)
  (vl-cmdf "_.pline")
  (while (/= 0 (getvar 'cmdactive))
    (vl-cmdf pause)
  )
  (setvar 'celtype oldCeltype)
  (setvar 'celweight oldCelweight)
  (setvar 'clayer oldClayer)
  (setvar 'plinewid oldPlinewid)
  (princ)
)

marcelmaas

Roy_043

Wat is er fout aan het gebruik van de linetype continuous?
Dat is toch een doorgetrokken lijn, welke linetype zouden we anders moeten gebruiken.
Ik denk dat ik je anders niet helemaal goed begrijp.

Maar ook in jou nieuwe routine krijg ik weer een hele fijne stippellijn, en krijg hem pas normaal als ik de linetype hidden2 opnieuw heb geladen en gedefineerd.


roy_043

Citaat van: marcelmaas op wo 24 11 2010, 15:12:08
Wat is er fout aan het gebruik van de linetype continuous?
Helemaal niets. Maar er zijn maar weinig bedrijven met een lagenstructuur met 59 lagen die allemaal het lijntype continuous hebben. Veel bedrijven geven er principieel de voorkeur aan om entiteiten te tekenen met "alles" bylayer. Kleur, lijntype etc. worden dan overgenomen van de laag en zijn (naderhand) gemakkelijker te wijzigen.

Ten behoeve van verdere analyse:
- Werkt een regen ook i.p.v. het opnieuw laden van het lijntype?
- Controleer (ten overvloede) Measurement.
- Controleer of het lijntype HIDDEN2 niet per ongeluk al in de tekening zit (zit overigens niet in de tekening Blanco).
- Als je het command -LINETYPE (met streepje) uitvoert, welk lin-bestand wordt dan gebruikt?
- Controleer alle lin-bestanden.
- Vervang deze regel in de laatste lisp:
    (vl-cmdf "_.linetype" "_load" lType "" "")
  door:
    (vl-cmdf "_.linetype" "_load" lType "acadiso.lin" "")
- Idem, maar dan met het volledige pad naar "acadiso.lin".

Als je de oplossing niet vindt, post dan een Voor.dwg en een Na.dwg, opgeslagen respectievelijk voor en na het opnieuw inladen van het lijntype.

marcelmaas

- een regen werkt niet zonder meer, maar nadat ik de linetype opnieuw heb geladen moet ik nog wel een regen doen om de   stippellijn goed in beeld te krijgen.
- Measurement staat gewoon op 1.
- hidden2 komt niet voor in de tekening waar ik mee start.
-met -linetype en daarna ? staat als standaard ''acadiso.lin" geselecteerd.
- de lisp regel vervangen en nog geen ander resultaat.

Dus heb ik beide voor en na dwg's bijgevoegd, zodat je in de 'voor' tekening kunt zien hoe mijn tekening eruit ziet nadat ik de lisp heb gebruikt, en in de 'na' tekening hoe hij eruit ziet nadat de linetype heb gereload en geregenereerd.


roy_043

Analyse lijntypes:

Voor.dwg:

(
  (-1 . <Entity name: 022d3848>)
  (0 . "LTYPE")
  (5 . "57734")
  (330 . <Entity name: 1079d510>)
  (100 . "AcDbSymbolTableRecord")
  (100 . "AcDbLinetypeTableRecord")
  (2 . "HIDDEN2")
  (70 . 0)
  (3 . "Hidden (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _")
  (72 . 65)
  (73 . 2)
  (40 . 0.1875)
  (49 . 0.125)
  (74 . 0)
  (49 . -0.0625)
  (74 . 0)
)


Na.dwg:

(
  (-1 . <Entity name: 104965b8>)
  (0 . "LTYPE")
  (5 . "57734")
  (330 . <Entity name: 10359400>)
  (100 . "AcDbSymbolTableRecord")
  (100 . "AcDbLinetypeTableRecord")
  (2 . "HIDDEN2")
  (70 . 0)
  (3 . "Hidden (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _")
  (72 . 65)
  (73 . 2)
  (40 . 4.7625)
  (49 . 3.175)
  (74 . 0)
  (49 . -1.5875)
  (74 . 0)
)


De conclusie is dat, inderdaad :wink:, in eerste instantie HIDDEN2 uit acad.lin wordt geladen en niet uit acadiso.lin. Waarbij ik ervan uitga dat er niet met lin-bestanden is gerommeld...

Dit is erg vreemd!

Ik heb nog één mogelijke oplossing:
Als je deze regel, in jouw "lege" tekening, kopieert naar de commando-regel wordt het correcte lijntype dan wel geladen?:
(vla-load (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object))) "hidden2" "acadiso.lin")

Als dat geen oplossing biedt dan gedraagt Acad zich niet zoals verwacht of is er toch iets mis met de lin-bestanden. (Meerdere lin-bestanden met dezelfde naam maar een verschillende inhoud? Op verschillende plaatsen?)



marcelmaas

Ik krijg de volgende melding als ik de tekst in de command regel plak en op enter druk.

Command: (vla-load (vla-get-linetypes (vla-get-activedocument
(vlax-get-acad-object))) "hidden2" "acadiso.lin")
; error: no function definition: VLAX-GET-ACAD-OBJECT

HofCAD

#22
Citaat van: marcelmaas op do 25 11 2010, 10:21:14
Ik krijg de volgende melding als ik de tekst in de command regel plak en op enter druk.

Command: (vla-load (vla-get-linetypes (vla-get-activedocument
(vlax-get-acad-object))) "hidden2" "acadiso.lin")
; error: no function definition: VLAX-GET-ACAD-OBJECT

Gebruik in een tekening waar HIDDEN2 nog niet geladen is:
(vl-load-com)
(vla-load (vla-get-linetypes (vla-get-activedocument
(vlax-get-acad-object))) "hidden2" "acadiso.lin")


Met vriendelijke groet, HofCAD CSI.

PS In acadiso.lin is de definitie voor HIDDEN2:
*HIDDEN2,Hidden (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
A, 3.175, -1.5875
Dat betekent dat als de LTSCALE op 1 staat: een streepje 3.175 lang is
en de openruimte 1.5875 lang is.
Je annotatieve schaal is 1:50 en daarom is alles in de Na.dwg 50X zo groot.
Als ik met mijn PL40 programma een polylijn teken bij een annotatieve schaal van 1:1,
dan tekent hij deze met de juiste HIDDEN2.
Als ik daarna de annotatieve schaal naar 1:50 verander en REGEN geef,
dan is hij bij mij aangepast.
ACADcadabra

marcelmaas

Hofcad,

Nadat ik jou laatste 3 regels code op command regel heb geplakt en daarna enter wordt de goede hidden2 geladen, als ik daarna de lisp pl40 gebruik dan werkt het allemaal goed.
De polylijn wordt gestippeld getekend op de goede laag, dus zoals de bedoeling was.

Maar ik begrijp inmiddels wat jullie bedoelde met bylayer tekenen, dat is inderdaad wel onze bedoeling.
Dus zouden we nog een andere laag aan moeten maken voor de linetype 'hidden' om daarop de andere variant te kunnen tekenen met een iets andere stippellijn.



roy_043

@ HofCAD goed gezien: (vl-load-com) ontbrak in mijn vorige lisp.

@ marcelmaas
Er zat eigenlijk een fout in mijn vorige lisp. Het lijntype moet logischerwijs eerder geladen worden. Hieronder een verbeterde versie (misschien nog interessant om mee te testen):

(defun c:PL40 ( / oldCeltype oldCelweight oldClayer oldPlinewid lay lType)
  (setq oldCeltype (getvar 'celtype))
  (setq oldCelweight (getvar 'celweight))
  (setq oldClayer (getvar 'clayer))
  (setq oldPlinewid (getvar 'plinewid))
  (setq lay "HCKP_SONOREX")
  (setq lType "HIDDEN2")
  (setvar 'cmdecho 0)
  (if (not (tblsearch "LTYPE" lType))
    (vl-cmdf "_.linetype" "_load" lType "acadiso.lin" "")
  )
  (if (not (tblsearch "LAYER" lay))
    (vl-cmdf "_.layer" "_new" lay "")
  )
  (vl-cmdf
    "_.layer"
    "_on"      lay
    "_thaw"    lay
    "_unlock"  lay
    "_color"   4     lay ; deze regel eventueel weglaten
    "_ltype"   lType lay ; deze regel eventueel weglaten
    "_lweight" 0.25  lay ; deze regel eventueel weglaten
    ""
  )
  (setvar 'cmdecho 1)
  (setvar 'celtype lType)
  (setvar 'celweight -1)
  (setvar 'clayer lay)
  (setvar 'plinewid 40)
  (vl-cmdf "_.pline")
  (while (/= 0 (getvar 'cmdactive))
    (vl-cmdf pause)
  )
  (setvar 'celtype oldCeltype)
  (setvar 'celweight oldCelweight)
  (setvar 'clayer oldClayer)
  (setvar 'plinewid oldPlinewid)
  (princ)
)



Tenslotte mijn laatste (?) versie die gebruikmaakt van vla-load. Er zijn 2 commando's PL40HID en PL40HID2 (zelf aanpassen):

(defun PLwWidth (width layer color lType lWeight / oldCeltype oldCelweight oldClayer oldPlinewid)
  (setq oldCeltype (getvar 'celtype))
  (setq oldCelweight (getvar 'celweight))
  (setq oldClayer (getvar 'clayer))
  (setq oldPlinewid (getvar 'plinewid))
  (if (not (tblsearch "LTYPE" lType))
    (progn
      (vl-load-com)
      (vla-load (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object))) lType "acadiso.lin")
    )
  )
  (setvar 'cmdecho 0)
  (if (not (tblsearch "LAYER" layer))
    (vl-cmdf "_.layer" "_new" layer "")
  )
  (vl-cmdf
    "_.layer"
    "_on"      layer
    "_thaw"    layer
    "_unlock"  layer
    "_color"   color   layer ; waarde wordt telkens oveschreven, deze regel daarom eventueel weglaten
    "_ltype"   lType   layer ; idem
    "_lweight" lWeight layer ; idem
    ""
  )
  (setvar 'cmdecho 1)
  (setvar 'celtype "ByLayer")
  (setvar 'celweight -1) ; is ByLayer
  (setvar 'clayer layer)
  (setvar 'plinewid 40)
  (vl-cmdf "_.pline")
  (while (/= 0 (getvar 'cmdactive))
    (vl-cmdf pause)
  )
  (setvar 'celtype oldCeltype)
  (setvar 'celweight oldCelweight)
  (setvar 'clayer oldClayer)
  (setvar 'plinewid oldPlinewid)
  (princ)
)
(defun c:PL40HID () (PLwWidth 40 "HCKP_SONOREX_HIDDEN" 4 "HIDDEN" 0.25))
(defun c:PL40HID2 () (PLwWidth 40 "HCKP_SONOREX_HIDDEN2" 4 "HIDDEN2" 0.25))


marcelmaas

@roy_043

Jou laatste versie  :wink: werkt helemaal goed.
De beide programma's werken zoals gewenst, met de verschillende lagen en linetype's dus idd je laatste versie is een feit.!!!

Mag ik jullie beide hartelijk danken hiervoor..!!! :ole: :vreegoe: :vreegoe: :vreegoe:


roy_043

Als ik alles overloop dan krijg ik het vermoeden dat AutoCAD bij het layer commando de lijntypes altijd laadt uit acad.lin. Ongeacht de instelling voor MEASUREMENT.

HofCAD

#27
Citaat van: roy_043 op do 25 11 2010, 13:56:41
Als ik alles overloop dan krijg ik het vermoeden dat AutoCAD bij het layer commando de lijntypes altijd laadt uit acad.lin. Ongeacht de instelling voor MEASUREMENT.
Beste Roy_043,

Als je mijn programma's PL40 gebruikt dan krijg ik altijd al de HIDDEN2 uit acadiso.lin
Dat controleer ik door de lengte van een streepje op te meten, en die is bij mij
met een LTSCALE van 1 heel netjes 3.175.
De opmerking 'bij het layer commando de lijntypes altijd laadt uit acad.lin' snap ik niet
want in de dialoogbox van LAYER kun je kiezen tussen acad.lin en acadiso.lin.
Waarschijnlijk bedoel je bij het commando -LAYER en dan de situatie dat het
lijntype niet geladen is.
Maar dat geldt bij mij ook niet, want ook dan is bij mij met een LTSCALE van 1
het streepje heel netjes 3.175.


Met vriendelijke groet, HofCAD CSI.
ACADcadabra

roy_043

Citaat van: HofCAD op do 25 11 2010, 14:11:44
commando -LAYER
Klopt.
Citaat van: HofCAD op do 25 11 2010, 14:11:44
en dan de situatie dat het lijntype niet geladen is.
Dat ligt erg voor de hand, dus dat klopt ook.

Conclusie: Het blijft een raadsel? Versie afhankelijk?

FastFiber