Thread Pro/Engineer VB API und Perl-Script (12 answers)
Opened by Zulu at 2011-10-29 13:09

GUIfreund
 2011-10-31 17:52
#153695 #153695
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
2011-10-29T20:28:13 Zulu
Ich habe den Kode analog zum VBA Beispiel erweitert:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#use warnings;
use Win32::OLE;

$asynconn = Win32::OLE->new("pfcls.pfcAsyncConnection");
$conn = $asynconn->Connect( "", "", ".", 5 );
$session = $conn->Session;
$mdlName = $session->CurrentModel->FileName;
$model = $session->CurrentModel;

#VBA code:   solid = CType(model, IpfcSolid)
$solid = IpfcSolid $model; # type casting ???
#VBA code:   solidProperties = solid.GetMassProperty(Nothing)
$solidProperties = $solid->$GetMassProperty();
$Mass = $solidProperties->Mass;

print "model: $model", "\n";
print "solid: $solid", "\n";
print "solidProperties: $solidProperties", "\n";
print "mdlName: $mdlName", "\n";
print "Mass: $Mass", "\n";x

$conn->Disconnect(2);

Zu Zeile 1: Aktiviere diese Zeile unbedingt wieder. Und setze noch "use strict;" in die Zeile davor. Und falls du die Fehlermeldungen von Perl nicht verstehst, auch noch "use diagnostics;". Je früher du auf Fehler hingewiesen wirst um so besser (inklusive Programmabbruch). Es hat keinen Sinn, mit falschen Werten weiter zu rechnen.

Als Konsequenz dieser Änderungen musst du jeder Perl-Variablen vor dem ersten Gebrauch "my " voranstellen. Das entspricht dem "Dim " in VBA. Wenn du willst, kannst du diese Deklarationen ebenso wie in VBA en bloc am Anfang machen.

Zu Zeile 8: Im VBA-Kode stehen da noch Fehlerprüfungen:
Code: (dl )
1
2
3
4
5
6
7
If model Is Nothing Then
Throw New Exception("Model not present")
End If
If (Not model.Type = EpfcModelType.EpfcMDL_PART) And
_(Not model.Type = EpfcModelType.EpfcMDL_ASSEMBLY) Then
Throw New Exception("Model is not a solid")
End If

Versuche, möglichst viel davon in den Perlkode herüberzuretten, etwa so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
[/c]
if (!defined $model) {   # vielleicht auch "if (! $model) {" 
    die "Model not present";
}
# Und dann versuchsweise:
print 'model.Type ', $model->Type, "\n";
print 'EpfcModelType.EpfcMDL_PART ', EpfcModelType->EpfcMDL_PART, "\n";
print 'EpfcModelType.EpfcMDL_ASSEMBLY ', EpfcModelType->EpfcMDL_ASSEMBLY, "\n";


Zu Zeile 10-14: Wie suresh schon schrieb, benötigt man in Perl kein Type-Casting. Bei Objekten kennt Perl einen anderen Mechanismus: Vererbung. Wenn du Glück hast, kommst du damit weiter. Versuche es mit folgender Änderung:
Code (perl): (dl )
1
2
3
4
#VBA code:   solid = CType(model, IpfcSolid)
$solid = $model; # nur um weniger ändern zu müssen
#VBA code:   solidProperties = solid.GetMassProperty(Nothing)
$solidProperties = $solid->GetMassProperty();

Beachte dass das $ vor GetMassProperty weg muss. Das ist einer der Fehler, die dir nach der Änderung von Zeile 1 nicht mehr durchrutschen.
Gruß
GUIfreund

View full thread Pro/Engineer VB API und Perl-Script