Delphi 7 API SolidWorks

0

Witam zainteresowanych!

Od razu lepiej napisze, że programista ze mnie żaden :-D. Mam następujący problem:
Znalazłem na stronce http://www.artoflog.com/cao/solidworks-delphi/delphi-solidworks.htm
kod programiku napisanego w delphi. Spodobał mi się do sporo projektuje w SolidWorks.

po nieznacznym zmodyfikowaniu kodu:

unit uMainTestSolidworksWithDelphi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, Math;

type
  TformTest = class(TForm)
    butTest: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure butTestClick(Sender: TObject);
  private
  public
  end;

var
  formTest: TformTest;

implementation

{$R *.dfm}

procedure TformTest.butTestClick(Sender: TObject);
var SldWorks : IDispatch;
    SldDoc : IDispatch;
    kolo1, szyk : IDispatch;
    y, r, n : extended;
begin
y := (StrToFloat(Edit1.Text))/1000;
r := (StrToFloat(Edit2.Text))/1000;
n := StrToFloat(Edit3.Text);
  try
    SldWorks := GetActiveOleObject('SldWorks.Application');
    if (SldWorks = nil) then
      ShowMessage('nie moge nawiąza połączenia z SolidWorks')
    else
    begin
      SldDoc := Variant(SldWorks).NewPart;
      if SldDoc = nil then
        ShowMessage('Nie mogę utworzyc nowej czesci')
      else
      begin
        Variant(SldDoc).SetTitle2('Delphi-Solidworks-ArtOfLog');
        Variant(SldDoc).SetAddToDB(TRUE);
        kolo1 := Variant(SldDoc).CreateCircleByRadius2(0, y, 0, r/2);
        szyk := Variant(SldDoc).CreateCircularSketchStepAndRepeat(y, DegToRad(270), n, 0, True, 0);
      end
  end
  except
    on E: Exception do
    begin
      ShowMessage(E.Message)
    end;
  end;

end;


end.

end

mam 2 problemy których nie mogę rozwiązać (z pewnością ze względu na nikłe wiadomości programistyczne).

problem 1:

jeśli SolidWorks nie jest uruchomiony nie wyświetla się informacja:
ShowMessage('nie moge nawiąza połączenia z SolidWorks')

oraz jeśli SW jest zajenty:

ShowMessage('Nie mogę utworzyc nowej czesci')

problem 2:

na tym najbardziej mi zależy!

Wszystko się pięknie rysuje ale na sam koniec, kiedy program tworzy szyk kołowy aplikacja wywala błąd : Could not convert variand of type (Boolean) into type (Dispatch)

kompletnie nie wiem o co chodzi!!

Jeśli ktoś jest w stanie mi pomóc to bardzo bym o to prosił.

a to może się przydać:

Syntax (OLE Automation)

retval = ModelDoc2.CreateCircularSketchStepAndRepeat ( arcRadius, arcAngle, patternNum, patternSpacing, patternRotate, deleteInstances )

Input:
(double) arcRadius
Radius to be used in the circular sketch pattern

Input:
(double) arcAngle
Angle relative to the sketch entities being patterned

Input:
(long) patternNum
Total number of instances, including the seed geometry

Input:
(double) patternSpacing
Spacing between pattern elements in radians

Input:
(BOOL) patternRotate
Rotate the pattern

Input:
(BSTR) deleteInstances
Instance numbers to delete passed as a string in the format: "(a) (b) (c) "

Return:
(BOOL) retval
TRUE if the sketch pattern was created successfully, FALSE otherwise

Syntax (COM)

status = ModelDoc2->CreateCircularSketchStepAndRepeat ( arcRadius, arcAngle, patternNum, patternSpacing, patternRotate, deleteInstances, &retval )

Input:
(double) arcRadius
Radius to be used in the circular sketch pattern

Input:
(double) arcAngle
Angle relative to the sketch entities being patterned

Input:
(long) patternNum
Total number of instances, including the seed geometry

Input:
(double) patternSpacing
Spacing between pattern elements in radians

Input:
(VARIANT_BOOL) patternRotate
Rotate the pattern

Input:
(BSTR) deleteInstances
Instance numbers to delete passed as a string in the format: "(a) (b) (c) "

Output:
(VARIANT_BOOL) retval
TRUE if the sketch pattern was created successfully, FALSE otherwise

Return:
(HRESULT) status
S_OK if successful

0

Hehe ktoś w końcu po moim fachu. Niestety ja też bardziej znam się na CADach niż na programowaniu ale spróbuj tak:
Zadeklaruj stałe:

 const
VARIANT_TRUE = Smallint(-1);
VARIANT_FALSE = Smallint(0);

i podstawiaj w miejsce gdzie masz wstawić VARIANT_BOOL.

Szkoda że aktualnie mam zainstalowanego Solida bo robię w Inventorze, bym się też pobawił ;-P

A tak a propos jak będziesz podobne rzeczy miał dla Inventora w Delphi to daj znać. Inventor też udostępnia swoje API ale przykłady są tylko w C++ a na razie przekładanie tego na Delphi za długo mi schodzi, więc i motywacji brak.
Oczywiście jak masz coś do SolidEdga, ProE czy Catii to też nie pogardzę [green]

0

no niestety nie działa :-( czekam dalej :-)

sporo o API w SolidWorks znajdziesz w SolidWorks.2005-2008.Video.Course.Volume.REPACK-QUASAR

0

Troszkę się pośpieszyłem [glowa]

pwk napisał(a)

...
szyk := Variant(SldDoc).CreateCircularSketchStepAndRepeat(y, DegToRad(270), n, 0, True, 0);
...

retval = ModelDoc2.CreateCircularSketchStepAndRepeat ( arcRadius, arcAngle, patternNum, patternSpacing, patternRotate, deleteInstances )

...
...
Output:
(VARIANT_BOOL) retval
TRUE if the sketch pattern was created successfully, FALSE otherwise

...
</quote>

tutaj jako ostatni parametr masz dać zmienną typy boolean bo to jest wartość zwracana a nie wprowadzana.

/// edit
albo raczej błąd jest tu:
szyk : IDispatch;

szyk jest typu IDispatch a funkcja zwraca ci wartość boolean. więc raczej zadekalruj jeszcze zminenną
successful : boolean;

i

successful := Variant(SldDoc).CreateCircularSketchStepAndRepeat(y, DegToRad(270), n, 0, True, 0);

Warto spróbować

0

jeszcze raz dzięki!! ale znów to samo

cos czyje ze chodzi o tem fragment ale nie wiem jak to ugryźć:

Input:
(BSTR) deleteInstances
Instance numbers to delete passed as a string in the format: "(a) (b) (c) "

0

może to pomoże:

http://www.mcadtools.net/Article/ShowArticle.asp?ArticleID=70

(mało przyjazny jezyk ;-D)

kiedyś kombinowałem z tym kodem ale bez rezultatu.

0

DZIAŁA !!! Jesteś wielki !!! wisze Ci krate browara [browar]

jak bedziesz mial jeszcze chwile to możesz pomyśleć nad problemem nr 1 ;-)

0

Może tak :-/

 try
      SldWorks := GetActiveOleObject('SldWorks.Application');
   except
      try
         SldWorks :=CreateOleObject('SldWorks.Application');
      except
         ShowMessage('nie moge nawiąza połączenia z SolidWorks lub SolidWorks nie jest zainstalowany')
         Exit;
      end;
   end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1