abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python
GELÖST!

verschiebliche Hotspots mit Dynamischem Array

JonasSP
Booster

Hallo zusammen 
ich würde gerne verschiebliche Hotspot generieren. Dies gelingt auch so weit. allerdings ist die Anzahl der Hotspots Dynamisch. 
im Parameterscript initalisiere ich die Parameter

    DIM x[]
    DIM y[]
    FOR i = 1 to points
        x[i]=i
        y[i]=i
    NEXT i
   PARAMETERS  x=x
  PARAMETERS y=y

Und im 2D Script erstelle ich die Hotspots

    unid=0
    FOR i=1 to points
        !x control
        HOTSPOT2 0,y[i],        unID,x[i],1+128     :unID=unID+1        !BASE
        HOTSPOT2 x[i],y[i],     unID,x[i],2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,y[i],       unID,x[i],3         :unID=unID+1        !REF
    NEXT i

Jetzt habe ich Einfach das Problem, das im Parameter Script x[i]=i steht und ich entsprechend die Hotspots nicht verschieben kann da i ein Fixer wert ist und nicht auf einen Parameter verweist. 
ich hoffe es kann mir jemand helfen

Operating system used: Windows 10

1 AKZEPTIERTE LÖSUNG

Akzeptierte Lösungen
Lösung

Herzlichen Dank jetzt scheint alles wie gewünscht zu funktionieren 

Lösung in ursprünglichem Beitrag anzeigen

13 ANTWORTEN 13
JonasSP
Booster

ich gehe davon aus, dass das Problem im Parameterscript liegt 

    FOR i = 1 to points
        x[i]=i
        y[i]=0
    NEXT i

Wenn ich die Definition 
x[i]=i ausklammere dann sind die Hotspots verschieblich, allerdings ist die Anzahl nicht mehr dynamisch
Frank Beister
Moderator

Kann sein, dass die Syntax nicht genau stimmt, aber vom Prinzip:

if vardim1(x)< points then

for i= vardim1(x) to points
parameters x[i]=i, y[i]=0
next i

endif
bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm

herzlichen Dank für die schnelle Antwort 
Allerdings funktiniert es nach wie vor nicht 
da es mir die das Array x und y nicht mehr Dynamisch macht 
Wenn ich points z.b im auf 2 oder grösser setze geht nicht mehr und die Array Grösse von x und y bleibt bei 1


habe nun folgenden Code im Parameterscript

    DIM x[]
    dim y[]
    FOR i = 1 to points
          x[i]=i
          y[i]=0
       
    NEXT i

if vardim1(x)< points then
    for i= vardim1(x) to points
        parameters x[i]=i
        parameters y[i]=0
    next i

endif
   
    PARAMETERS      x=x
    PARAMETERS      y=y
Wenn ich die Rot markierten Stellen auskommentiere sind die Hotspots verschieblich aber die Hotspots dafür nicht mehr verschieblich
wo ist mein Fehler?
herzlichen Dank im Voraus für jede Hilfe

 

Der Fehler ist, dass die verschobenen Werte immer wieder überschrieben werden. Das Parameters Skript wird immer abgearbeitet, wenn ein Parameter geändert wird. Kontinuierlich immer wieder sogar, wenn ein beweglicher Fangpunkt im Grundriss verändert wird. Er wird geändert und sofort wieder auf die Anfangswerte überschrieben. das kann nicht gehen.

 

Ein Auslagern dieses Skriptteiles hat übrigens auch keinen Sinn, weil PARAMETERS nur im Parameter Skript funktioniert.

 

Wie oben eingebaut war meine Idee nicht gedacht. DIM für x und y ist überflüssig. Ist ja ohnehin ein Parameter, sonst funktionieren die Hotspots ja nicht. Vorher noch alles initialisieren ist auch kontraproduktiv. S.o. Alle existierenden Felder des Arrays brauchen keine neuen Werte.

 

! ##################
! PARAMETER SKRIPT

n = vardim1(x)
if n < points then
  for i = n+1 to points
    parameters x[i] = x[n] + (i-n) , y[i] = y[n]
  next i
endif

! ##################
! 2D SKRIPT

    unid=0
    FOR i=1 to vardim1(x)
        !x control
        HOTSPOT2 0,y[i],        unID,x[i],1+128     :unID=unID+1        !BASE
        HOTSPOT2 x[i],y[i],     unID,x[i],2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,y[i],       unID,x[i],3         :unID=unID+1        !REF
    NEXT i

 

Wo kommt denn "points" her? ist das ein Parameter in der Liste und wird nicht graphisch bestimmt?

 

Points muss wahrscheinlich ein PARAMETER sein. das hängt aber von dem Gesamtkonzept des Objektes ab.

bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm

Herzlichen Dank für die Unterstützung 
Ich mache Langsam Fortschritte 😃
Ja points kommt von einem Parameter
Was ich eigentlich machen will vereinfacht gesagt Ich habe eine Linie diese Teile ich durch eine bestimmte Anzahl Punkte (points) diese Punkte sollen aber auf der Line verschieblich sein. An dem jeweiligen Punkt will ich ein weiteres Objekt hinzufügen. 

Das funktioniert nun auch schon fast nur das die Eingefügten Hotspots immer einen Abstand zur Linie haben. 

unid=0
	!X controll
        HOTSPOT2 0,StartY,        unID,StartX,1+128     :unID=unID+1        !BASE
        HOTSPOT2 StartX,StartY,     unID,StartX,2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,StartY,       unID,StartX,3         :unID=unID+1        !REF
	
!y controll
	HOTSPOT2 StartX,0,        unID,StartY,1+128     :unID=unID+1        !BASE
        HOTSPOT2 StartX,StartY,   unID,StartY,2         :unID=unID+1        !MOVE
        HOTSPOT2 StartX,-1,       unID,StartY,3         :unID=unID+1        !REF
	
!x controll
	HOTSPOT2 0,EndeY,        unID,EndeX,1+128     :unID=unID+1        !BASE
        HOTSPOT2 EndeX,EndeY,    unID,EndeX,2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,StartY,       unID,EndeX,3         :unID=unID+1        !REF
	
!y controll
	HOTSPOT2 EndeX,0,       	unID,EndeY,1+128     :unID=unID+1        !BASE
        HOTSPOT2 EndeX,EndeY,     	unID,EndeY,2         :unID=unID+1        !MOVE
        HOTSPOT2 EndeX,-1,       	unID,EndeY,3         :unID=unID+1        !REF

hotline2  StartX,StartY, EndeX,EndeY
line2 StartX,StartY, EndeX,EndeY
vx= EndeX-StartX
vy=EndeY-StartY
alpha = ATN((vy)/(vx))
unid=0
FOR i=1 to points
  del top
  rot2 Alpha
  If StartX-EndeX>0 then rot2 180
    HOTSPOT2 0, y[i] , 	unID,x[i],1+128     :unID=unID+1        !BASE
    HOTSPOT2 x[i],y[i], unID,x[i],2         :unID=unID+1        !MOVE
    HOTSPOT2 -1,y[i],   unID,x[i],3         :unID=unID+1        !REF

    xstr = STR(x[i]*1000,5,1)
    ystr = STR(y[i]*1000,5,1)
    text2 x[i],y[i], "x:" + xstr +" y:"+ ystr
    del top

    Add2 x[i],y[i]
    CALL "Simpson Strong Tie AE116" PARAMETERS all
    del top
    NEXT i

 

JonasSP_0-1733408035096.png



Ich komme einfach nicht darauf wo der Fehler ist

 



Das ist nicht eindeutig, was du schreibst und programmierst. Was ich verstehe:
1. Du willst zwischen Start und Ende deiner Linie an beliebiger Stelle Teilungspunkte setzen. Diese Punkte möchtest du auf der Linie im Grundriss beweglich verschieben.

2. Du möchtest von diesen Punkten ausgehend jeweils senkrecht (zu was? Zur Linie? Zur Projektorientierung (=Bildschirmrand unten/oben)? Zum Objektrand (=Objekt-X-Achse) - die hat je nach Drehung des Gesamtobjektes eine andere Richtung) in einem wieder per Hotspot beweglich Abstand ein Objekt ausgeben.

 

Oder sollen die Objekte auf der Linie sitzen? Im Moment gibt dein y[i] nämlich nicht viel Sinn.

Und was funktioniert da nicht?

BTW: Ich würde den Startpunkt deiner Linie auf 0/0 lassen (=einsparen) und nicht beweglich machen, weil:
- das macht es einfacher in der Programmierung

- deine erzeugten Geometrien und deren Darstellung bleiben dicht am Nullpunkt des Objektes und können vom Anwender nicht unangemessen weit davon verschoben werden (-> Performance des Projektes).

Wahrscheinlich kannst du dir den Endpunkt ebenfalls ganz sparen, wenn du einfach die Objektbreite (A) nimmst. Und zur Drehung drehst du das Objekt.

bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm

Herzlichen Dank für die Antwort
das Ganze ist nur ein teil eines grösseren Scripts. (Einer Wand welche Verankerungswinkel eingezeichnet werden sollen) 
Ich Versuches nochmals genauer zu erläutern:
Es gibt eine Linie welche zur einen Startpunkt und Endpunkt defniert ist (StartX, StartY sowie EndeX, EndeY)
an dieser Linie Entlang sollen die Verankerungswinkel eingefügt werden. 
Mit einem Fixen Abstand Funktiniert das ganze einwandfrei. Es sollte jedoch möglich sein die Winkel entlang der Wandachse auch von Hand zu verschieben. 
Deswegen die Dynamischen Hotspots. 
Als es soll nichts rechtwinklig dazu stehen sondern alles auf der Linie. 
Das mein y[i] nicht so viel Sinn macht habe ich auch bemerkt, aber ich sehe den Fehler nicht. 
Die Rotation mache ich lediglich damit sich die Hotspots immer im gleichen Winkel bewegen wie die Wand. Den Winkel habe ich ja berechnet. 


Momentan würde ich gerne die Endpunkte gerne beide Dynamisch halten, da dies das Handling für den Nutzer vereinfacht wenn dieser beide Enden manipulieren kann. 

Ich hoffe so ist es etwas verständlicher. 





 



Etwas. Aber nicht 100%. 🙂

In x[i] sind Ordinaten deiner Winkel gespeichert. Damit sich diese nicht verändern, wenn du Start und Ende deiner Linie veränderst, müssen diese in Richtung der Linie gemessen werden. Daher musst du da nicht lange mit dem Winkel hin und her drehen. Gehe an den Startpunkt und drehe dein Koordinatensystem um die Neigung der Linie. Das ist nicht ganz einfach zu berechnen, wenn die Koordinaten beliebig sein können. Wenn du y nicht brauchst, dann verwende es nicht. 🙂

 

 

unid=0
	!X controll
        HOTSPOT2 0,StartY,        unID,StartX,1+128     :unID=unID+1        !BASE
        HOTSPOT2 StartX,StartY,     unID,StartX,2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,StartY,       unID,StartX,3         :unID=unID+1        !REF
	
!y controll
	HOTSPOT2 StartX,0,        unID,StartY,1+128     :unID=unID+1        !BASE
        HOTSPOT2 StartX,StartY,   unID,StartY,2         :unID=unID+1        !MOVE
        HOTSPOT2 StartX,-1,       unID,StartY,3         :unID=unID+1        !REF
	
!x controll
	HOTSPOT2 0,EndeY,        unID,EndeX,1+128     :unID=unID+1        !BASE
        HOTSPOT2 EndeX,EndeY,    unID,EndeX,2         :unID=unID+1        !MOVE
        HOTSPOT2 -1,StartY,       unID,EndeX,3         :unID=unID+1        !REF
	
!y controll
	HOTSPOT2 EndeX,0,       	unID,EndeY,1+128     :unID=unID+1        !BASE
        HOTSPOT2 EndeX,EndeY,     	unID,EndeY,2         :unID=unID+1        !MOVE
        HOTSPOT2 EndeX,-1,       	unID,EndeY,3         :unID=unID+1        !REF

hotline2  StartX,StartY, EndeX,EndeY
line2 StartX,StartY, EndeX,EndeY

vx = EndeX-StartX
vy = EndeY-StartY

! Hier kann es sein, dass noch einmal 180° dazugerechnet werden 
! müssen, wenn der Vektor in den III. oder IV. Quadranten zeigt.
alpha = ATN( vy/vx )

add2 StartX, StartY
rot2 alpha

! Festlegung in welchem Abstand die Elemente gesetzt werden sollen.
abstand = 0

FOR i=1 to vardim1(x)
    HOTSPOT2 0, 0, 	unID,x[i],1+128     :unID=unID+1        !BASE
    HOTSPOT2 x[i],0, unID,x[i],2         :unID=unID+1        !MOVE
    HOTSPOT2 -1,0,   unID,x[i],3         :unID=unID+1        !REF

    xstr = STR(x[i]*1000,5,1)
    ystr = STR(abstand*1000,5,1)
    text2 x[i],0, "x:" + xstr +" y:"+ ystr

    Add2 x[i], abstand
    ! Sollen die Winkel nicht senkrecht zu Linie stehen braucht es
    ! hier vielleicht noch ein ROT2 -alpha und nach dem CALL auch ein DEL 2
    CALL "Simpson Strong Tie AE116" PARAMETERS all
    del 1
    NEXT i

del 2

 

 

Das Skript habe ich aus dem Kopf und ohne Test geändert. Die Richtung solltest du aber erkennen, wenn es nicht funktioniert. 

bim author since 1994 | bim manager since 2018 | author of selfGDL.de | openGDL | skewed archicad user hall of fame | author of bim-all-doors.gsm

Setup info provided by author

Keine Antwort gefunden?

Andere Beiträge
im Board ansehen

Zurück zum Board

Neueste Lösungen durchsuchen

Akzeptierte Lösungen zeigen

Eine neue Diskussion starten!

Neues Thema erstellen