Почему Kompas теряет грани если в координатах есть 0

Автор DimonD, 11.10.04, 17:39:20

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

DimonD

Здрастуйте
Вот пример функции которая добавляет в масив Face, а потом из этого масива я и вытягиваю все что нужно

AddToCollFaceBypoint(float x , float y, float z, TEskiz*Esk)
{

 if (!EdgeFase)
    {
    EdgeFase = (ksEntityCollection*)Esk->part->EntityCollection(o3d_entity);
    EdgeFase->clear();
    }
 ksEntityCollection* TempEntity = (ksEntityCollection*)
                Esk->part->EntityCollection(o3d_face);
  bool res = TempEntity->SelectByPoint(x, y, z);
   int count = TempEntity->GetCount();
      if ( count && res  )
      {
       EdgeFase->Add(TempEntity->Last());

       return 1;
      }
 return 0;

}

Здравствуйте!

Привожу полный модуль на Delphi, все строится четко. Ваша ошибка в том, что Вы пытаетесь запихать в интерфейс не то, что надо одним вызовом метода SelectByPoint невозможно определить четыре грани так, как мы пока еще живем в трехмерном измерении. Надеюсь, что с кодом Вы разберетесь, если будут вопросы, всегда буду рад помочь.

Всегда с уважением Борис.

unit grani;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, KGAXLib_TLB, ksTlb, LDefin3D, LDefin2D;

type
  TForm1 = class(TForm)
    KGAX1: TKGAX;
    Button1: TButton;
    procedure Prorisovka(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Prorisovka(Sender: TObject);
var
 iKompas:KompasObject;
 iDoc3D:Document3D;
 iPart:ksPart;
 iEntity,iPlane,iBaseExtrusion,IncLine:ksEntity;
 iSketchDefinition:ksSketchDefinition;
 iBaseExtrusionDefinition:ksBaseExtrusionDefinition;
 iInclineDefinition:ksInclineDefinition;
 iEntityCollection,iEntityCollectionFace:ksEntityCollection;
 iDoc2D:ksDocument2D;
 I:Integer;
begin
  iKompas:=KompasObject(KGAX1.GetKompasObject);
  iDoc3D:=ksDocument3D(iKompas.ActiveDocument3D);
  iDoc3D.author := ’Ìåëüíèê Á.Í.’;
  iDoc3D.comment := ’Ïðèìåð ïî ïðîñüáå òðóäÿùèõñÿ’;
  iDoc3D.fileName :=’d:\test.m3d’;
  iDoc3D.UpdateDocumentParam();
  iDoc3D.Save();
  iDoc3D.drawMode:=vm_Shaded;
  iPart:=ksPart(iDoc3D.GetPart(pNew_Part));
  iPart.name:=’Ïðèìåð ïî ïðîñüáå òðóäÿùèõñÿ’;
  iPart.fixedComponent:=False;
  iPart.standardComponent:=False;
  iPart.Update;
  iEntity:=ksEntity(iPart.NewEntity(o3d_sketch));
  iSketchDefinition:=ksSketchDefinition(iEntity.GetDefinition);
  iPlane:=ksEntity(iPart.GetDefaultEntity(o3d_planeXOY));
  iSketchDefinition.SetPlane(iPlane);
  iSketchDefinition.angle:=0;
  iEntity.Create;
  iDoc2D:=ksDocument2D(iSketchDefinition.BeginEdit);
  iDoc2D.ksLineSeg(0,0,0,100,1);
  iDoc2D.ksLineSeg(0,100,100,100,1);
  iDoc2D.ksLineSeg(100,100,100,0,1);
  iDoc2D.ksLineSeg(100,0,0,0,1);
  iSketchDefinition.EndEdit;
  iBaseExtrusion:=ksEntity(iPart.NewEntity(o3d_baseExtrusion));
  iBaseExtrusionDefinition:=ksBaseExtrusionDefinition(iBaseExtrusion.GetDefinition);
  iBaseExtrusionDefinition.directionType:=dtNormal;
  iBaseExtrusionDefinition.SetSideParam(True,etBlind,35,0,True);
  iBaseExtrusionDefinition.SetThinParam(False,dtNormal,0,0);
  iBaseExtrusionDefinition.SetSketch(iEntity);
  iBaseExtrusion.Create;

// Код построения уклона начало
  IncLine:=ksEntity(iPart.NewEntity(o3d_incline));
  iInclineDefinition:=ksInclineDefinition(IncLine.GetDefinition);
  iInclineDefinition.angle:=10;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_face));
  iEntityCollection.SelectByPoint(50,50,0);
  iInclineDefinition.SetPlane(iEntityCollection.First);
  iEntityCollectionFace:=ksEntityCollection(iInclineDefinition.FaceArray);
  iEntityCollection.Clear;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_face));
  iEntityCollection.SelectByPoint(0,0,10);
  for I:=0 to iEntityCollection.GetCount-1 do
   iEntityCollectionFace.Add(iEntityCollection.GetByIndex(I));
  iEntityCollection.Clear;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_face));
  iEntityCollection.SelectByPoint(100,100,10);
  for I:=0 to iEntityCollection.GetCount-1 do
   iEntityCollectionFace.Add(iEntityCollection.GetByIndex(I));
  IncLine.Create;
// Код построения уклона конец

  iPart.Update;
  iDoc3D.Save;
end;

end.

DimonD

Здрастуйте
Спасиба за пример я разберусь
Я заметил такую штуку:
Мой колега пишет на Делфи и у него грани не теряются но у него проблема с ребрами если в координате ребра есть 0 то оно неберется допустим если хотим построить фаску а в координатах неимеющих 0 то все строится.
Я пишу на Borland 5 C++ и у меня немного наоборот неопределяются грани если там нет 0 в некоторых случаях

А на счет той функции которую я вам показал мы написали клас 3D опираций и при каждом вызове в этот масив записывается грань тоесть я ее вызываю не 1 раз а 4 раза и в этом масиве хранится 4 грани а при вытягивании из масива (я проверял) берется 4 грани а при создании самой операции они могут терятся.
что Вы можете предложить ?

Здравствуйте!

Я модифицировал пример, добавив работу с ребрами. Как и раньше все работает нормально. Если Вы внимательно посмотрите пример, то увидите, что ребра и грани определяются четко, только те которые нужны, и потеряться они уже не могут. Разницы нет, на каком языке программирования Вы пишите, Компас тоже не виноват, просто последнему нужно ставить конкретную задачу, с которой он справляется без проблем.

Всегда с уважением Борис.

unit grani;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, KGAXLib_TLB, ksTlb, LDefin3D, LDefin2D;

type
  TForm1 = class(TForm)
    KGAX1: TKGAX;
    Button1: TButton;
    procedure Prorisovka(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Prorisovka(Sender: TObject);
var
 iKompas:KompasObject;
 iDoc3D:Document3D;
 iPart:ksPart;
 iEntity,iPlane,iBaseExtrusion,IncLine,iChamfer:ksEntity;
 iSketchDefinition:ksSketchDefinition;
 iBaseExtrusionDefinition:ksBaseExtrusionDefinition;
 iInclineDefinition:ksInclineDefinition;
 iEntityCollection,iEntityCollectionFace,iEntityCollectionChamfer:ksEntityCollection;
 iChamferDefinition:ksChamferDefinition;
 iDoc2D:ksDocument2D;
 I:Integer;
begin
  iKompas:=KompasObject(KGAX1.GetKompasObject);
  iDoc3D:=ksDocument3D(iKompas.ActiveDocument3D);
  iDoc3D.author := ’Мельник Б.Н.’;
  iDoc3D.comment := ’Пример работы с гранями и ребрами’;
  iDoc3D.fileName :=’d:\test.m3d’;
  iDoc3D.UpdateDocumentParam();
  iDoc3D.Save();
  iDoc3D.drawMode:=vm_Shaded;
  iPart:=ksPart(iDoc3D.GetPart(pNew_Part));
  iPart.name:=’ Пример работы с гранями и ребрами ’;
  iPart.fixedComponent:=False;
  iPart.standardComponent:=False;
  iPart.Update;
  iEntity:=ksEntity(iPart.NewEntity(o3d_sketch));
  iSketchDefinition:=ksSketchDefinition(iEntity.GetDefinition);
  iPlane:=ksEntity(iPart.GetDefaultEntity(o3d_planeXOY));
  iSketchDefinition.SetPlane(iPlane);
  iSketchDefinition.angle:=0;
  iEntity.Create;
  iDoc2D:=ksDocument2D(iSketchDefinition.BeginEdit);
  iDoc2D.ksLineSeg(0,0,0,100,1);
  iDoc2D.ksLineSeg(0,100,100,100,1);
  iDoc2D.ksLineSeg(100,100,100,0,1);
  iDoc2D.ksLineSeg(100,0,0,0,1);
  iSketchDefinition.EndEdit;
  iBaseExtrusion:=ksEntity(iPart.NewEntity(o3d_baseExtrusion));
  iBaseExtrusionDefinition:=ksBaseExtrusionDefinition(iBaseExtrusion.GetDefinition);
  iBaseExtrusionDefinition.directionType:=dtNormal;
  iBaseExtrusionDefinition.SetSideParam(True,etBlind,35,0,True);
  iBaseExtrusionDefinition.SetThinParam(False,dtNormal,0,0);
  iBaseExtrusionDefinition.SetSketch(iEntity);
  iBaseExtrusion.Create;

  iChamfer:=ksEntity(iPart.NewEntity(o3d_chamfer)); // Начало описания фасок
  iChamferDefinition:=ksChamferDefinition(iChamfer.GetDefinition);
  iChamferDefinition.SetChamferParam(True,20,20);
  iEntityCollectionChamfer:=ksEntityCollection(iChamferDefinition.Array_);
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_edge));
  iEntityCollection.SelectByPoint(0,0,10);
  iEntityCollectionChamfer.Add(iEntityCollection.First);
  iEntityCollection.Clear;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_edge));
  iEntityCollection.SelectByPoint(100,0,10);
  iEntityCollectionChamfer.Add(iEntityCollection.First);
  iEntityCollection.Clear;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_edge));
  iEntityCollection.SelectByPoint(100,100,10);
  iEntityCollectionChamfer.Add(iEntityCollection.First);
  iEntityCollection.Clear;
  iEntityCollection:=ksEntityCollection(iPart.EntityCollection(o3d_edge));
  iEntityCollection.SelectByPoint(0,100,10);
  iEntityCollectionChamfer.Add(iEntityCollection.First);
  iEntityCollection.Clear; // Конец описания фасок

  IncLine:=ksEntity(iPart.NewEntity(o3d_incline)); // Начало описания уклона
  iInclineDefinition:=ksInclineDefinition(IncLine.GetDefinition

kosmatenko

Добрый день!
По мему опыту создания фасок, операция создания почемуто исключает повторяющиеся обьекты (грани или ребра), проверь может у тебя в координатках чето неТАК с КООРДИНАТКАМИ.
Всего наилучшего.

DimonD

Привет Костя :-)
Да ты прав толькошто проверил все координата :-) и немного промахнулся вместо face попал в edge большое спасиба
Особенная Благодарность Sabahs за то что всячески мне помогал
с Уважением DiM