Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 24.07.2006, 10:48 Titel: Werte einlesen und weiter verabeiten |
|
|
Hallo ich habe hier mal eine Frage und zwar geht es darum das ich in Catia ein Macro programmiere das mir eine Fahrbahn berrechnet. Da ich relativ wenig Ahnung hiervon habe nun meine Frage wie kann ich das anstellen!?
Ich habe bereits das Programm schon soweit das ich einezelne Koordinaten auslesen kann und die Länge zwischen ihnen berrechnet es auch schon allerdings nur die Abstände. Nun würde ich gerne immer die letzen 2 Längenwerte wieder in einen Speicher legen und vergleichen damit ich fals diese gleich sind diese weiter nehemen kann und hieraus dann das Bogenmaß berrechen kann. Ich hoffe das ich das Problem recht gut schildern konnte.
Hier unten seht ihr auch mal mein bissheriges Programm.
Es liest die einzelen Punkte ein und gibt sie in einer Exel Tabelle wieder aus aber nur die x-;y- Koordinaten und den Abstand der beiden.
nun fehlt noch ein einlesen und vergleich der letzten 2 werte umd damit weiter zurechnen
Code: |
If fFileExist() <> 0 then
Set Datei = CATIA.FileSystem.CreateFile (cDateiPfad, False)
Else
Set Datei = CATIA.FileSystem.GetFile (cDateiPfad)
End If
Dim mySelection as Selection
Set mySelection = Catia.ActiveDocument.Selection
Dim AnzahlSelekt as integer
AnzahlSelekt = mySelection.count ' Gibt an wieviele Elemente selektiert wurden
Dim DStrom as TextStream
Set DStrom = Datei.OpenAsTextStream ("ForAppending")
DStrom.Write (";" &Chr(10)& ";" & "Punkteausgabe mit editierten Macro " & Chr(10)& Chr(10))
DStrom.Write ("START" & Chr(10))
DStrom.Write ( "Element" & ";" & "X-Koordinate" & ";" & "Y-Koordinate" & ";" & "Z-Koordinate" & ";" & "Distanz" &Chr(10))
Dim I as integer
Dim oPunktKoord(2) as CATSafeVariant
Dim oSelElem as Object
Dim x as integer
Dim y as integer
Dim xres as integer
Dim yres as integer
Dim dis as double
yres = 0
xres = 0
For I = 1 to AnzahlSelekt
Set oSelElem = mySelection.Item(I)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & oPunktKoord(2) & ";" & dis
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name &";" & oPunktKoord(0)& ";"& oPunktKoord(1)&";"& oPunktKoord(2) &";" & dis &";" &Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
Next
DStrom.Write ("ENDE" & Chr(10)& Chr(10)& Chr(10))
DStrom.Close
End Sub
|
Editiert durch Moderator: CODE-Tags hinzugefügt zwecks besserer Übersichtlichkeit und Chancenerhöhung einer Antwort. (A.K.) |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 24.07.2006, 11:44 Titel: |
|
|
---> Verschoben ins Computer-Forum da es sich nicht um Qbasic/Freebasic handelt; auch wenn der Code stark daran erinnert.
MFG A.K.
Editiert durch Moderator: Danke für den Hinweis Michael. (A.K.) _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU*
Zuletzt bearbeitet von A.K. am 24.07.2006, 16:32, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 24.07.2006, 16:17 Titel: |
|
|
Kannst du in den Quellcode ein paar Kommentare packen?
Entweder liegt es am ungewohnten Basic Dialekt oder an den Temperaturen, aber ich kann den Quellcode kaum lesen.
@A.K.
Du darfst auch die Code Box um den Quellcode setzen _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 25.07.2006, 10:20 Titel: |
|
|
naja ich kann schon was dazu schreiben aber das wesentliche steht ja schon dabei!!
weis natürlich auch nicht welchen teil ich da komentieren soll da ich nicht soviel plan davon hab ist ein Macro ! |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 25.07.2006, 11:20 Titel: Re: Werte einlesen und weiter verabeiten |
|
|
Ich Versuche es mal.
Objekt Orentiertes Basic? Okey.
Chr(10) ist wohl ein Zeilenumbruch.
Nun zur deine Frage.
Ich muss erstmal nachsehen, was Bogenmass genau ist
http://de.wikipedia.org/wiki/Bogenmass
Es geht also um den Winkel in Bogenmass?
tan(phi) = GK/AK = Y / X
Zitat: | Ich habe bereits das Programm schon soweit das ich einezelne Koordinaten auslesen kann und die Länge zwischen ihnen berrechnet es auch schon allerdings nur die Abstände. |
Was gehört bei dir noch zu Länge ausser dem Abstand?
Anders gefragt: Wo ist der Unterschied zwischen Länge und Abstand? _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 25.07.2006, 15:51 Titel: |
|
|
also Länge ist gleich Abstand von einem Punkt zum anderen ist eine einfache Vektorberrechnung
nun will ich immer die letzten 2 Maße miteinander vergleichen und fals diese gleich sind darauf schließen das es sich um einen Kreisbogen handelt und diesen dann berrechnen.
mein Prob ist ich weis nicht wie ich das mache das ich die letzten 2 Werte in einen Variable schreibe und vergleiche und damit dann weiter rechne! |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 25.07.2006, 16:49 Titel: |
|
|
Jetzt verstehe ich's ungefähr.
Code: | If fFileExist() <> 0 then
Set Datei = CATIA.FileSystem.CreateFile (cDateiPfad, False)
Else
Set Datei = CATIA.FileSystem.GetFile (cDateiPfad)
End If
Dim mySelection as Selection
Set mySelection = Catia.ActiveDocument.Selection
Dim AnzahlSelekt as integer
AnzahlSelekt = mySelection.count ' Gibt an wieviele Elemente selektiert wurden
Dim DStrom as TextStream
Set DStrom = Datei.OpenAsTextStream ("ForAppending")
DStrom.Write (";" &Chr(10)& ";" & "Punkteausgabe mit editierten Macro " & Chr(10)& Chr(10))
DStrom.Write ("START" & Chr(10))
DStrom.Write ( "Element" & ";" & "X-Koordinate" & ";" & "Y-Koordinate" & ";" & "Z-Koordinate" & ";" & "Distanz" &Chr(10))
Dim I as integer
Dim oPunktKoord(2) as CATSafeVariant
Dim oSelElem as Object
Dim x as integer
Dim y as integer
Dim xres as integer
Dim yres as integer
Dim dis as double
dim disAlt as double
dim bogen as double
yres = 0
xres = 0
For I = 1 to AnzahlSelekt
Set oSelElem = mySelection.Item(I)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
disAlt=dis
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
if dis=disalt then
bogen=ATN((x-xres)/(y-yres))
end if
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & oPunktKoord(2) & ";" & dis
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name &";" & oPunktKoord(0)& ";"& oPunktKoord(1)&";"& oPunktKoord(2) &";" & dis &";" &Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
Next
DStrom.Write ("ENDE" & Chr(10)& Chr(10)& Chr(10))
DStrom.Close
End Sub |
Wenn du mit Bogenmass, eben den Winkel meinst, sollte die Berechnung passen oder zumindest ein anfang sein.
Wie die Ausgabe sein soll, weiss ich aber nicht. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 31.07.2006, 12:07 Titel: |
|
|
Hallo also die Ausgabe ist dann in einer Exel Tabelle wo die Daten stehen das ist nicht das Problem das geht alles soweit nur hab ich jetzt das Problem wenn ich 2 aufeinander folgende Radien habe das es dann ein Fehler gibt da ich durch null teilen würde!?? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 31.07.2006, 12:55 Titel: |
|
|
Achso, du willst einfach keine Doppelungen?
Code: | If fFileExist() <> 0 then
Set Datei = CATIA.FileSystem.CreateFile (cDateiPfad, False)
Else
Set Datei = CATIA.FileSystem.GetFile (cDateiPfad)
End If
Dim mySelection as Selection
Set mySelection = Catia.ActiveDocument.Selection
Dim AnzahlSelekt as integer
AnzahlSelekt = mySelection.count ' Gibt an wieviele Elemente selektiert wurden
Dim DStrom as TextStream
Set DStrom = Datei.OpenAsTextStream ("ForAppending")
DStrom.Write (";" &Chr(10)& ";" & "Punkteausgabe mit editierten Macro " & Chr(10)& Chr(10))
DStrom.Write ("START" & Chr(10))
DStrom.Write ( "Element" & ";" & "X-Koordinate" & ";" & "Y-Koordinate" & ";" & "Z-Koordinate" & ";" & "Distanz" &Chr(10))
Dim I as integer
Dim oPunktKoord(2) as CATSafeVariant
Dim oSelElem as Object
Dim x as integer
Dim y as integer
Dim xres as integer
Dim yres as integer
Dim dis as double
yres = 0
xres = 0
For I = 1 to AnzahlSelekt
Set oSelElem = mySelection.Item(I)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
if xres<>x or yres<>yres then
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & oPunktKoord(2) & ";" & dis
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name &";" & oPunktKoord(0)& ";"& oPunktKoord(1)&";"& oPunktKoord(2) &";" & dis &";" &Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
end if
Next
DStrom.Write ("ENDE" & Chr(10)& Chr(10)& Chr(10))
DStrom.Close
End Sub |
So etwa? _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 31.07.2006, 16:24 Titel: |
|
|
ja so etwa nicht unbedingt eine dopplung zeil soll sein das ich eine beliebige Bahnkurve kann auch auch 3,4 oder mehr aufeinander folgende Radien bestehen. aber ich werde das mal so probieren wo ist denn nun die genau Änderung zum vorherigen Prog!?? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 31.07.2006, 17:04 Titel: |
|
|
Zu deinem Ursprungsprogramm:
Zitat: |
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
if xres<>x or yres<>yres then
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & oPunktKoord(2) & ";" & dis
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name &";" & oPunktKoord(0)& ";"& oPunktKoord(1)&";"& oPunktKoord(2) &";" & dis &";" &Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
end if
Next |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 02.08.2006, 22:33 Titel: |
|
|
THX
werd nun mal schauen was rauskommt und dann wieder fragen ist echt duper das forum hier mus man schon sagen!
 |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 29.09.2006, 18:35 Titel: |
|
|
hallo
hab mal wieder eine Frage zu meinem Problem
Code: |
Function fFileExist() as Integer
On Error Resume Next
CATIA.FileSystem.GetFile (cDateiPfad)
fFileExist = Err.Number
End Function
Sub CATMain()
If fFileExist() <> 0 then
Set Datei = CATIA.FileSystem.CreateFile (cDateiPfad, False)
Else
Set Datei = CATIA.FileSystem.GetFile (cDateiPfad)
End If
Dim mySelection as Selection
Set mySelection = Catia.ActiveDocument.Selection
Dim AnzahlSelekt as integer
AnzahlSelekt = mySelection.count ' Gibt an wieviele Elemente selektiert wurden
Dim DStrom as TextStream
Set DStrom = Datei.OpenAsTextStream ("ForAppending")
DStrom.Write (";" &Chr(10)& ";" & "Punkteausgabe mit editierten Macro " & Chr(10)& Chr(10))
DStrom.Write ("START" & Chr(10))
DStrom.Write ( "Element" & ";" & "X-Koordinate" & ";" & "Y-Koordinate" & ";" & "Z-Koordinate" & ";" & "Distanz" & ";" & " Bogenmaß " &Chr(10))
Dim I as integer ' Deklaration der Variablen
Dim oPunktKoord(2) as CATSafeVariant
Dim oSelElem as Object
Dim x as integer
Dim y as integer
Dim xres as integer
Dim yres as integer
Dim dis as double
dim disAlt as double
dim bogen as double
Dim xAlt as double
Dim yAlt as double
'Variablen für Vorberechnung
Dim j as integer
Dim counter as integer
dim bm as integer
Dim x1 as double
Dim x2 as double
Dim y1 as double
Dim y2 as double
yres = 0
xres = 0
For I = 1 to AnzahlSelekt
'Rechnet 3 Schritte vorraus zum schauen ob ein Bogenmass kommt.
if bm <> 1 then
For j = 1 to 4
Set oSelElem = mySelection.Item(j)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
disAlt = dis
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
yres = y
xres = x
if dis = disAlt then
bm = 1
end if
Next
end if
Set oSelElem = mySelection.Item(I)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
disAlt = dis
dis = ((x - xres) * (x - xres)) + ((y -yres) * (y -yres))
dis = Sqr(dis)
if bm = 1 then
if count >= 1 then
x2 = x
y2 = y
count = count + 1
end if
if count < 1 then
x1 = x
y1 = y
count = count + 1
end if
end if
if dis = disAlt then
bogen = ((x1 + x2) * (x2 + x)) + ((y1 + y2) * (y2 + y))
bogen = bogen / (Sqr( (((x1 + x2) * (y1 + y2)))^2 ) ) * ( Sqr((((x2 + x) * (y2 + y)))^2 ))
bogen = bogen / Sqr(bogen * bogen + 1)
count = 0
bm = 0
end if
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & oPunktKoord(2) & ";" & dis & ";" & bogen
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name &";" & oPunktKoord(0)& ";"& oPunktKoord(1)&";"& oPunktKoord(2) &";" & dis &";" & bogen &";"& Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
bogen = 0
Next
DStrom.Write ("ENDE" & Chr(10)& Chr(10)& Chr(10))
DStrom.Close
End Sub
|
also soweit geht es nun nur kann ich den ARCOS nicht berechnen da ich nicht weiß wie das geht da es diese Funktion ja nicht in Qbasic gibt oder doch!?
des weiteren bin ich mir auch nicht sicher ob das mit dem speichern der Werte so stimmt! Wäre super wenn einer mal drüber schauen könnte und mir vielleicht helfen .
Die Ausgabe stimmt soweit alles geht nur noch um die 2 Punkte |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 29.09.2006, 21:58 Titel: |
|
|
Hi,
Bartsch, Mathematische Formeln hat Folgendes geschrieben: | Berechnung einer Arcusfunktion durch eine andere
(gültig für die Hauptwerte)
arcsin x = Pi/2 - arccos x = arctan((x / (Sqrt(1 - x²)))
arccos x = Pi/2 - arcsin x = arccot((x / (Sqrt(1 - x²)))
arctan x = Pi/2 - arccot x = arcsin((x / (Sqrt(1 + x²)))
arcsin x = Pi/2 - arccos x=arctan((x / (Sqrt(1 + x²)))
___________________________________________________________
Code: |
arccot x = arctan (1 / x) für x > 0 \
= (allgemeingültig)
= arctan (1 / x) + Pi für x < 0 / |
|
Daß x hierbei im Bogenmaß(Radiant) sein muß, erwähne ich nur am Rande..
Die Funktion arctan() ist aber (meistens) eingebaut(warum wohl ),
sodaß der Berechnung von arccos nix mehr im Wege steht..
Ich habe hier weitgehend die mathematische Schreibweise benutzt,
sie sollte für einen Programmierer jedoch lesbar und verständlich sein
[Edit]
Damit du nicht alles selbst schreiben mußt, habe ich mal in meinen Pascal-Sourcen gewühlt.. Code: | 'Ä=Ž , Ö=™ , Ü=š ; ä=„ , ö=”, ü=? , ß=á ,§=õ , ©=¸
?"ArcusFunktionen.Bas ¸2006 by ytwinky, MD"
Function IIF(Bedingung As Long) As Long
Return Bedingung
End Funktion
Function ACot(x As Double) As Double
If x=0.0 Then
Return 0.0
Else
Return Atn(1.0/x)+IIF(x<0, 4*Atn(1), 0)
End Function
Function ArcTan(x As Double) As Double
Return Atn(x)+IIF(x<0, 4*Atn(1), 0)
End Function
Function ACos(x As Double) As Double
If Abs(x)>1.0 Then
?"Fehler in ACOS, Argument>1.0"
?"x="; x
Sleep
End
End If
If Abs(x)=1.0 Then Return IIF(x<0, 4*Atn(1), 0)/2.0
If Abs(x)<1.0 Then Return ACot(x/Sqrt(1.0-x*x))
If Abs(x)=0.0 Then Return 2*Atn(1)
End Function
Function ASin(x As Double) As Double
If Abs(x)>1.0 Then
?"Fehler in ASIN, Argument>1.0"
?"x="; x
Sleep
End
End If
If Abs(x)=1.0 Then Return 2*Atn(1)
If Abs(x)<1.0 Then Return Atn(x/Sqrt(1.0-x*x))*Sgn(x)
End Function |
Der Code ist nur portiert (läuft ja), etwaige Fehler sind zu Schulungszwecken eingebaut
Ernsthaft:
Eine FreeBASIC-Version für Arcus-Funktionen wird es demnächst auf ytwinky.freebasic.de geben..
..ich leide gerade an den Schulungszwecken(und an einem derben Schnupfen )
So, geschafft: Arcus-Functions.Bas
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 13.11.2006, 18:38 Titel: |
|
|
So ich hab nun mal etwas weiter mich versucht doch hab ich nun ein Problem ein Debugger bietet mir ja Catia nicht an oder gibt es diese funktion.
Leider habe ich es auch nicht geschaft einen einfachen Wert als Alert auszugeben womit ich mir meine berechnetten Werte ausgeben kann.
Weis zufällig jemand eine Funktion die mir einen String oder eine Variable auf den Bildschirm sendet? |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 27.12.2006, 17:11 Titel: |
|
|
hallo
hab da noch mal ein Problem vielleicht kann mir jemand hierbei helfen!!
hab die rechung durchgerechnet und das stimmt alles soweit aber das programm verhaut mir immer die werte für das Bogenmaß!
leigt vielleicht daran das ich über den bereich der Variable raus komme,
wenn ich allerdings in die Zeile wo ich das Bogenmaß berechne bei jemde Maß eine /1000 hinzufüge damit der Wert kleiner wird. Bringt er mir immer einen Fehler mit SQR in Zeile wo ich /1000 gemacht habe
vielleicht kann mir einer sage was hier der fehler ist währe super nett
unten das Programm!
hab die gennante Zeile extra mit Freiräumen hervorgehoben (Absätze)
Code: | Sub CATMain()
If fFileExist() <> 0 Then
Set Datei = Catia.FileSystem.CreateFile(cDateiPfad, False)
Else
Set Datei = Catia.FileSystem.GetFile(cDateiPfad)
End If
Dim mySelection As Selection
Set mySelection = Catia.ActiveDocument.Selection
Dim AnzahlSelekt As Integer
AnzahlSelekt = mySelection.count ' Gibt an wieviele Elemente selektiert wurden
Dim DStrom As TextStream
Set DStrom = Datei.OpenAsTextStream("ForAppending")
DStrom.Write (";" & Chr(10) & ";" & "Punkteausgabe mit editierten Macro " & Chr(10) & Chr(10))
DStrom.Write ("START" & Chr(10))
DStrom.Write ("Element" & ";" & "X-Koordinate" & ";" & "Y-Koordinate" & ";" & "Distanz" & ";" & " Bogenmaß " & Chr(10))
Dim I As Integer ' Deklaration der Variablen
Dim oPunktKoord(2) As CATSafeVariant
Dim oSelElem As Object
Dim x As Integer
Dim y As Integer
Dim xres As Integer
Dim yres As Integer
Dim dis As Double
Dim disAlt As Double
Dim bogen As Double
Dim xAlt As Double
Dim yAlt As Double
'Variablen für Vorberechnung
Dim j As Integer
Dim counter As Integer
Dim bm As Integer
Dim x1 As Double
Dim x2 As Double
Dim y1 As Double
Dim y2 As Double
Dim pi As Double
pi = 3.14159265358979
yres = 0
xres = 0
bm = 0
For I = 1 To AnzahlSelekt
'Rechnet 3 Schritte vorraus zum schauen ob ein Bogenmass kommt.
If bm < 1 Then
For j = 1 To 4
Set oSelElem = mySelection.Item(j)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
disAlt = dis
dis = ((x - xres) * (x - xres)) + ((y - yres) * (y - yres))
dis = SQR(dis)
yres = y
xres = x
If dis <> disAlt Then
bm = 1
End If
Next
End If
Set oSelElem = mySelection.Item(I)
oSelElem.Value.GetCoordinates (oPunktKoord)
x = oPunktKoord(0)
y = oPunktKoord(1)
disAlt = dis
dis = ((x - xres) * (x - xres)) + ((y - yres) * (y - yres))
dis = SQR(dis)
If bm <> 1 Then
If count >= 1 Then
x2 = x
y2 = y
count = count + 1
End If
If count < 1 Then
x1 = x
y1 = y
count = count + 1
End If
End If
If dis <> disAlt Then
bogen = 0
bogen = SQR((x - x1) * (x - x1) + (y - y1) * (y - y1))
bogen = 2 * ATN(bogen / (2 * SQR((dis / 1000) * (dis / 1000) - (bogen / 2) * (bogen / 2))))
bogen = (pi / 360) * bogen
bogen = (dis * bogen) * 1000
count = 0
bm = 0
End If
yres = y
xres = x
text = oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & dis & ";" & bogen
'text = replace(text, "," , ".") 'falls Dezimalpunkte erforderlich sind
DStrom.Write (mySelection.Item(I).Value.name & ";" & oPunktKoord(0) & ";" & oPunktKoord(1) & ";" & dis & ";" & bogen & ";" & Chr(10))
' Die Wertetabelle kann in Excel importiert werden. Wichtig dabei ist eine Dezimaltrennung mit Kommata!!!
Next
DStrom.Write ("ENDE" & Chr(10) & Chr(10) & Chr(10))
DStrom.Close
End Sub |
Editiert durch Moderator: Code-Tags hinzugefügt. (Sebastian) |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 27.12.2006, 22:03 Titel: |
|
|
Dieser Thread weckt auch in meinem Fall wieder einmal alte Erinnerungen... ;-) Die Zeit vor dem Informatikstudium noch auf dem ursprünglichen Beruf, nämlich Maschinenzeichner. Ich arbeitete damals mit dem CAD-System Bravo3 von Applicon (inzwischen von Unigraphics übernommen), damals noch auf DEC-VAX-Stationen unter VMS. Dies war schon vor 15 Jahren ein sehr ausgereiftes System, was Clientuserrechte (arbeiten als einfacher Benutzer ohne Adminrechte), Multiuserfähigkeiten anbelangt. Auf dem CAD-System selber hatte ich damals auch diverse Makros selber programmiert, die Programmiersprache hiess dort IAGL. Die dortige Sprache basierte seinerzeit noch auf PL/1. Damals natürlich noch nicht objektbasiert mit Properties, sondern haufenweise Funktionen wie ein BASIC-Interpreter mit umfangreichem Befehlssatz.
@Hyde-White:
Wenn ich Deine Beispiele richtig interpretiere, arbeitest Du demfall mit der Windows-Version und der Hersteller hat analog wie Microsoft bei ihrem Office und Internet Explorer auch zahlreiche ActiveX-Automatisierungsobjekte definiert, welche das Erstellen von Makros in Visual Basic Script (Endung .vbs) ermöglichen?
Zum Thema Typen: Eine gute Makrosprache sollte spezielle Datentypen auch für Längen und Winkel bereitstellen. Damals beim oben genannten IAGL musste man meines Wissens auch noch Typ "float" verwenden, aber man konnte immerhin mit getdistance() und getangle() (so hiess es glaube ich) den Benutzer eine Länge bzw. Winkel eingeben lassen, d.h. es erschien dann der komplette Prozessor, wo man z.B. bei der Länge anstelle einer Tastatureingabe die Länge auch als Abstand zweier Punkte definieren konnte. Diese Prozessoren eliminierten auf alle Fälle auch die Notwendigkeit, irgendwelche Einheitenumrechnungen selber machen zu müssen, weil die zurückgegebenen Werte jenen der Systemeinstellungen entsprochen haben.
Unter
http://de.wikipedia.org/wiki/Catia
scheint es noch einige gute Links zu haben, so dass Du hoffentlich auch für Catia eine Referenz mit allen Objektklassen, Methoden, Properties usw. ähnlich wie Microsoft dies in ihrem MSDN-Bereich auch veröffentlicht hat, finden kannst. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 28.12.2006, 19:43 Titel: |
|
|
Vielen dank für die antwort.
naja leider bin ich kein Programmierer und will es auch nicht werden
bin Maschinenbauer und das soll wie oben geschrieben meine Studienarbeit werden. hab ja alles soweit fertig aber nur das mit dem rechnen in der einen Lage funktioniert nicht ob es solche befehle wie getangel usw gibt ??? keine Ahnung aber würde mir wohl auch nichts bringen da ich die Koordinaten aus einer Zeichnung auslese und dann diese auswerte und berechne damit abstände winkel Bogenmass usw.
nur verstehe ich nicht was das problem ist wenn ich /1000 rechne weil wenn ich es nicht mache rechnet er ja auch aber halt nicht richtig und wenn ich /1000 einfüge bringt er mir einen fehler!!
?????  |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 29.12.2006, 19:14 Titel: |
|
|
Hyde-White hat Folgendes geschrieben: | Code: | ..
bogen = (pi / 360) * bogen
.. |
| ..wenn du mit dieser Zeile den Winkel umrechnest, dann erkläre mir bitte wie???
(Zum Hin- und Herrechnen benutze ich den Faktor 180/Pi, der identisch ist mit 45/Atn(1) und der auch normalerweise funktioniert und auch gerne benutzt wird )
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Hyde-White
Anmeldungsdatum: 24.07.2006 Beiträge: 13
|
Verfasst am: 01.01.2007, 20:41 Titel: |
|
|
oh ja das ist mein Fehler! sollte 180/Pi heißen
aber trotzdem mekert er immer noch in der gleichen Zeile wo ich /1000 rechne!! |
|
Nach oben |
|
 |
|