abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

Wir schätzen Ihren Input!
Bitte nehmen Sie an der Umfrage zu Archicad 28 Startbildschirm und Lerninhalte/Schnell-Tutorials teil

Programmierung
Alles über Programmierung in GDL und Python

Automatische Massstabsleiste in Layout (GDL-Objekt)

Reidon97
Participant

Hallo zusammen,

 

Ich vorbereite eine Vorlagedatei für unseres Büro auf ArchiCAD 27. Im Plankopf haben wir oft eine Massstabsleiste, die Massstababhängig ist. Es gibt schon ein GDL-Objekt dafür. Das Problem ist, wenn man dieses Objekt direkt in Layout nutzt, kann man es nicht am Massstab von einem Ausschnitt (oder einer Zeichnung) anpassen. Das Objekt erkennt, dass der Massstab in Layout 1:1 ist. Dort ist meine Frage: wie kann ich den Script von diesem GDL-Objekt ändern, so dass es mit dem Massstab von einem Ausschnitt verknüpft ist. Das heisst : Ich mache ein Layout mit einem Grundriss 1:50, die Massstabsleiste passt sich automatisch an 1:50. In einem anderen Layout mit dem gleichen Master mache ich ein Grundriss 1:100, die Massstabsleiste passt sich automatisch an 1:100. Ich bin sehr schlecht mit Script und Code, ich habe mit Chatgpt versucht, leider funktionniert den Code nicht. Hat jemand das schon programmiert ? Hier unten noch das Bild von unsere Massstabsleisten: 

Reidon97_1-1729000897571.png

Vielen Dank für ihre Hilfe !

 

Operating system used: Windows

8 ANTWORTEN 8

Mit Chatgpt 😂 ? Darf ich den Code mal sehen?

Nicht das ich Dir dabei helfen möchte/kann. Ist nur interessehalber.

„Was kümmert mich mein Geschwätz von gestern.Nichts hindert mich daran, klüger zu werden.“
MacBook Pro M3 MAX

BIM-Consulting / Archicad-Schulungen auf Anfrage
Reidon97
Participant

Ja eben wie gesagt ich habe keine Kenntnisse mit solchen Coden. Hier ist der Code : 


_rulerLength    = A
_iDetail        = iDet2

if iDet2 = DET_LEVEL_SCSENS then
    if GLOB_SCALE > 999 then                        ! 1:1000
        _rulerLength    = 100
        _iDetail        = DET_LEVEL_1000
    endif

    if GLOB_SCALE > 200 and GLOB_SCALE < 1000 then  ! 1:500
        _rulerLength    = 50
        _iDetail        = DET_LEVEL_500
    endif

    if GLOB_SCALE > 100 and GLOB_SCALE < 201 then   ! 1:200
        _rulerLength    = 20
        _iDetail        = DET_LEVEL_200
    endif

    if GLOB_SCALE > 50  and GLOB_SCALE < 101 then   ! 1:100
        _rulerLength    = 10
        _iDetail        = DET_LEVEL_100
    endif

    if GLOB_SCALE > 20  and GLOB_SCALE < 51 then    ! 1:50
        _rulerLength    = 5
        _iDetail        = DET_LEVEL_50
    endif

    if GLOB_SCALE > 5   and GLOB_SCALE < 21 then    ! 1:20
        _rulerLength    = 2
        _iDetail        = DET_LEVEL_20
    endif

    if GLOB_SCALE > 1   and GLOB_SCALE < 6 then     ! 1:5
        _rulerLength    = 0.5
        _iDetail        = DET_LEVEL_5
    endif

    if GLOB_SCALE < 2 then                          ! 1:1
        _rulerLength    = 0.1
        _iDetail        = DET_LEVEL_1
    endif
endif


if styp="Typ 2" then
    vst = _rulerLength/55
else
    vst = _rulerLength/40
endif

vst_2 = _rulerLength/20

hotspot2  _rulerLength/2, -vst/2
hotspot2 -_rulerLength/2, -vst/2

if _iDetail = DET_LEVEL_1000    then gosub "DetLevel_1000"
if _iDetail = DET_LEVEL_500     then gosub "DetLevel_500"
if _iDetail = DET_LEVEL_200     then gosub "DetLevel_200"
if _iDetail = DET_LEVEL_100     then gosub "DetLevel_100"
if _iDetail = DET_LEVEL_50      then gosub "DetLevel_50"
if _iDetail = DET_LEVEL_20      then gosub "DetLevel_20"
if _iDetail = DET_LEVEL_5       then gosub "DetLevel_5"
if _iDetail = DET_LEVEL_1       then gosub "DetLevel_1"


! ==============================================================================
end ! end ! end ! end ! end ! end ! end ! end ! end ! end ! end ! end ! end ! en
! ==============================================================================


! --- scale 1:1000 ---
"DetLevel_1000":

    eg=10
    egg=5
    egg_2=5
    pic=0

    ko=50
    ve="100 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:500 ---
"DetLevel_500":

    eg=5
    egg=3
    egg_2=2
    pic=10

    ko=10
    ve="50 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:200 ---
"DetLevel_200":

    eg=10
    egg=5
    egg_2=5
    pic=0

    ko=10
    ve="20 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:100 ---
"DetLevel_100":

    eg=10
    egg=5
    egg_2=5
    pic=0

    ko=5
    ve="10 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:50 ---
"DetLevel_50":

    eg=5
    egg=3
    egg_2=2
    pic=10

    ko=1
    ve="5 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:20 ---
"DetLevel_20":

    eg=10
    egg=5
    egg_2=5
    pic=0

    ko=1
    ve="2 m"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:5 ---
"DetLevel_5":

    eg=5
    egg=3
    egg_2=2
    pic=10

    ko=10
    ve="50 cm"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


! --- scale 1:1 ---
"DetLevel_1":

    eg=10
    egg=5
    egg_2=5
    pic=0

    ko=5
    ve="10 cm"

    if styp="Typ 1" then gosub "DrawType1"
    if styp="Typ 2" then gosub "DrawType2"

return


"DrawType1":

    pen cpn
    line_type lin_t

        line2 _rulerLength/2, -vst/2, -_rulerLength/2, -vst/2

    for i=1 to eg+1
        di = 0
        if abs(eg-10)<eps & (i=1 or i=eg/2+1 or i=eg+1) then
            di=(vst_2-vst)/2
        endif

        line2 _rulerLength/2, vst/2+di, _rulerLength/2, -vst/2
        hotspot2 _rulerLength/2, vst/2+di
        hotspot2 _rulerLength/2, -vst/2

        add2 -_rulerLength/eg, 0

    next i

    del eg+1

    if abs(eg-5)<eps then

        for i=1 to 9

            if i=5 then di=0.6*vst/2 else di=0

                line2 -_rulerLength/2+_rulerLength/(eg*10), -vst/2, -_rulerLength/2+_rulerLength/(eg*10), di

            add2 _rulerLength/(eg*10), 0

        next i

        del 9

    endif

    gosub "DrawText"

return


"DrawType2":

    hotspot2 _rulerLength/2, vst/2
    hotspot2 -_rulerLength/2, vst/2

    pen cpn
    line_type lin_t

        rect2 _rulerLength/2, vst/2, -_rulerLength/2, -vst/2

    line_type 1

    for i=1 to eg-1

            line2 _rulerLength/2-_rulerLength/eg, vst/2, _rulerLength/2-_rulerLength/eg, -vst/2
            hotspot2 _rulerLength/2-_rulerLength/eg, vst/2
            hotspot2 _rulerLength/2-_rulerLength/eg, -vst/2

        add2 -_rulerLength/eg, 0

    next i

    del eg-1

    fill bft [1]

    for i=1 to egg

            poly2_b 4, 2+4, bpn [1], back_pen [1],
                _rulerLength/2, vst/2, 1,
                _rulerLength/2-_rulerLength/eg, vst/2, 1,
                _rulerLength/2-_rulerLength/eg, -vst/2, 1,
                _rulerLength/2, -vst/2, 1

        add2 -2*_rulerLength/eg, 0

    next i

    del egg

    fill bft [2]

    add2 -_rulerLength/eg, 0

    for i=1 to egg_2

            poly2_b 4, 2+4, bpn [2], back_pen [2],
                _rulerLength/2, vst/2, 1,
                _rulerLength/2-_rulerLength/eg, vst/2, 1,
                _rulerLength/2-_rulerLength/eg, -vst/2, 1,
                _rulerLength/2, -vst/2, 1

        add2 -2*_rulerLength/eg, 0

    next i

    del egg_2
    del 1

    gosub "DrawText"
   
return


"DrawText":

    if styp="Typ 1" and abs(eg-10)<eps then vst_3=_rulerLength/30 else vst_3=_rulerLength/40

    DEFINE STYLE "Bez1" zeichens, schr_texte, 9, 0
    SET STYLE "Bez1"

    text2 _rulerLength/2, vst_3, ve

    DEFINE STYLE "Bez2" zeichens, schr_texte, 7, 0
    SET STYLE "Bez2"

    text2 -_rulerLength/2, vst_3, 0

    DEFINE STYLE "Bez3" zeichens, schr_texte, 8, 0
    SET STYLE "Bez3"

    if abs(eg-10)<eps then text2 0, vst_3, ko

    if abs(eg-5)<eps then
        ff = 0

        for i=1 to 4

            ff=ko+ff

                text2 -_rulerLength/2+_rulerLength/eg, vst_3, ff

            add2 _rulerLength/eg, 0

        next i

        del 4

    endif

return

Ich habe bemerkt den original Code arbeitet mit GLOB_SCALE und da ist das Problem. Es übernimmt den gesamten Massstab, also im Layout 1:1. Es sollte aber den Massstab von einem Ausschnitt übernehmen, wie die Titel von der Zeichnungen.

@Reidon97  schrieb:

 

... Es übernimmt den gesamten Massstab, also im Layout 1:1. Es sollte aber den Massstab von einem Ausschnitt übernehmen, wie die Titel von der Zeichnungen. ...

Auf einem Layout kannst du ja mehrere Zeichnungen mit unterschiedlichen Maßstäben einsetzen. Das Objekt müsste wissen, für welche Zeichnung der Maßstab sein soll. Daher denke ich, wird das nix mit dem automatischen Maßstab. Du könntest ein Zeichnungstitelobjekt programmieren, in dem dann auch die Maßstabdarstellung enthalten ist, aber das ist wahrscheinlich nicht sehr nutzerfreundlich in der Anwendung. 

Reidon97
Participant

Ja eben es gibt zwei Elemente die das machen : Zeichnungstitel und Autotext Massstab. Ich würde also eine Kombination von beiden haben.

 

die Zeichnungstitel ist zu stark mit dem Aussschnitt verbunden. Ich brauche etwas unabhängig.

 

Der Autotext Massstab reagiert auf dem Ausschnitt. Wenn ich zwei Ausschnitte habe zeigt es zwei Massstäbe. Ich kann auch den Massstab von einem Ausschnitt ausblenden.

 

Seht ihr was ich meine ? Kann man das machen ? Ich habe irgendwo gelesen, man muss Glob_scale mit ac_drawingscale ändern aber das ist keine variabel …

Magnus2
Contributor

Ohne jetzt auf das Programmieren etc. ein zu gehen. 
Wie wäre es Old-School mäßig die verschiedenen Maßstabsleisten auf einem Arbeitsblatt/(Master-)Layout zu zeichnen und entsprechend verwenden?
Dann hättest immer eine sichere Ablesehilfe egal was für Zeichnungen auf dein Layout kommen.

Wir wollen eine Massstableiste im Plankopf, also in Master selber. Wenn wir es nicht programmieren müssten wir jedesmal 10 unterschiedliche Master pro Format haben, da der Massstab immer unterschiedlich ist.

 

wenn wir es programmieren könnten, könnten wir weniger Master haben. Es wäre ja effizienter

Ohne das genauer geprüft zu haben, gilt eines in jedem Fall: Du kannst (leider) mit Autotexten keine Operationen durchführen. Also, wenn Du schreibst:
If autotext_scale = 50 THEN myLeiste = 1, funktioniert dieses nicht. Ich habe momentan auch keine Idee, wie es anders funktionieren könnte.

Jochen Suehlo . AC12-27 . MAC OSX 14.4 . WIN11
GDL object creation: b-prisma.de
archig
Expert

in das Masterlayout würde ich die Maßstabsleiste nicht setzen (unnötig viele Masterlayouts) sondern nur den Plankopf. 

Im jeweiligen Layout würde ich dann die entsprechende Maßstableiste mit 2D Elementen oder als manuell einstellbares Objekt hineinsetzen. 

man muss es auch nicht unnötig kompliziert machen...

ArchiCAD 25 / Windows 10

Setup info provided by author