Усечение 3D

Автор Nesh, 16.12.05, 14:17:22

« предыдущая - следующая »

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

Nesh

Как мне усеч деталь плоскотью произвольного положение, и как сделать ламаное сечения??? На Delphi?
Заранее спасибр за ответ!

IrоnМаxxx

ЦитироватьКак мне усеч деталь плоскотью произвольного положение, и как сделать ламаное сечения??? На Delphi?
Заранее спасибр за ответ!

Для сечения по кривой:
if CutExist then
          begin
            CutSketch := ksEntity(iPart.NewEntity( o3d_sketch ));
            if CutSketch  nil then
              begin
                CutSketchDef := ksSketchDefinition(CutSketch.GetDefinition);
                if CutSketchDef  nil then
                  begin
                    CutSketchDef.SetPlane( PlaneYOZ );
                      CutSketch.Create;
                      doc := ksDocument2D(CutSketchDef.BeginEdit);
                      doc.ksLineSeg(0, 0, 0, -dm2/2, 1);   // рисуешь свою кривульку
                      doc.ksLineSeg(0, 0, -dm2/2, 0, 1);
                      CutSketchDef.EndEdit;
                  end;
              end;
            iCutEfect := ksEntity(iPart.NewEntity( o3d_cutBySketch ));
            if iCutEfect  nil then
              begin
                Color := ksColorParam(iCutEfect.ColorParam);
                iCutBySketchDef := ksCutBySketchDefinition(iCutEfect.GetDefinition);
                if iCutBySketchDef  nil then
                  begin
                    iCutBySketchDef.direction := true;
                    iCutBySketchDef.SetSketch( CutSketch );
                    iCutEfect.Create;
                  end;
              end;
          end;

Для сечения плоскостью:

iCutEfect := ksEntity(PoluK.NewEntity( o3d_cutByPlane ));
              PlaneXOY := ksEntity(iPart.GetDefaultEntity( o3d_planeXOY ));
              if iCutEfect  nil then
                begin
                  Color := ksColorParam(iCutEfect.ColorParam);
                  iCutByPlaneDef := ksCutByPlaneDefinition(iCutEfect.GetDefinition);
                  if iCutByPlaneDef  nil then
                    begin
                      iCutByPlaneDef.direction := false;
                      iCutByPlaneDef.SetPlane( PlaneXOY );
                      iCutEfect.Create;
                    end;
                end;

Здесь вместо PlaneXOY можешь вставлять любую другую плоскость (ksEntity), только перед этим конечно ее придется создать (по 3 точкам, на расстоянии от базовой, под углом, через точку и прямую или как-нибудь иначе).

Drey

Так усекается сама 3D модель? А как бы получить в 2D чертеж сечение трехмерной модели?

Sheiker

Разрез / сечение можно получить методом ksDocument2D::ksCreateSheetSectionView.
Я сделал так:
Создал 2d документ (есть пример в sdk)
Создал асоциативный вид с модели методом ksCreateSheetArbitraryView передав ему:
                             - структуру параметров ассоциативного вида,
                             -номер создаваемого вида,
Создал линию разреза, проходящую через вид. (исходник взял из примера sdk)
Создал вид разрез/сечение (ksCreateSheetSectionView) , передав ему:
             - структуру параметров ассоциативного вида,
              -номер создаваемого вида,
             - указатель на объект "линия разреза".

Кривой исходнит вот:

var
iDoc2D:ksDocument2D;
docPar: ksDocumentParam;
shPar: ksSheetPar;
stPar : ksStandartSheet;
iAssociationViewParam:ksAssociationViewParam;
iViewParam:ksViewParam;
number:integer;

cut        : ksCutLineParam;
  tLinePar   : ksTextLineParam;
  ItemPar    : ksTextItemParam;
  tFont      : ksTextItemFont;
  tMathPoint : ksMathPointParam;
  pMathPoint : ksDynamicArray;
  obj        : Reference;

begin



iDoc2D:=ksDocument2D(Kompas.Document2D);
   docPar:= ksDocumentParam( kompas.GetParamStruct(ko_DocumentParam) );
  if (docPar <> nil) then begin
      docPar.fileName := '2dРДТТ2.cdw';  //TimeToStr(time)+'.cdw';
      docPar.comment  := 'create document';
      docPar.author   := 'user';
      docPar.regime   := 0;
      docPar.type_    := lt_DocSheetStandart;
      shPar           := ksSheetPar( docPar.GetLayoutParam() );
      if ( shPar <> nil ) then begin
         shPar.shtType    := 1;
         shPar.layoutName := '';
         stPar            := ksStandartSheet( shPar.GetSheetParam() );
               if ( stPar <> nil ) then begin
                 stPar.format   := 2;
                  stPar.multiply := 1;
                  stPar.direct:=true //горизонтально-вертикально
                                       end;
                                end;
      // создали документ: лист, формат А2, горизонтально расположенный
      // кратность 1

idoc2d.ksCreateDocument(docPar) ;
number:=0;

iAssociationViewParam:=ksAssociationViewParam(Kompas.GetParamStruct(ko_AssociationViewParam));
iAssociationViewParam.fileName:=Kompas.ksGetFullPathFromSystemPath('C:\3dmodel.a3d', sptLIBS_FILES);
iAssociationViewParam.projBodies:=True;
iAssociationViewParam.projThreads:=True;
iAssociationViewParam.visibleLinesStyle:=1;
iAssociationViewParam.projectionName:='#Сзади';
iAssociationViewParam.projBodies:=true;
iViewParam:=ksViewParam(iAssociationViewParam.GetViewParam);

iViewParam.name:='Вид 1';
iViewParam.x:=400;
iViewParam.y:=180;
iViewParam.scale_:=0.05;
iViewParam.state:=stCURRENT;
    iViewParam.Init;

iDoc2D.ksCreateSheetArbitraryView(iAssociationViewParam,number);

//iDoc2D.ksCreateSheetStandartViews(iAssociationViewParam, VIEW_LEFT,200,200);
//iDoc2D.ksCreateSheetStandartViews(iAssociationViewParam, VIEW_FRONT,1000,1000);


end;


begin
  cut        := ksCutLineParam( kompas.GetParamStruct(ko_CutLineParam) );
  tLinePar   := ksTextLineParam( kompas.GetParamStruct(ko_TextLineParam) );
  ItemPar    := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam) );
  tMathPoint := ksMathPointParam( kompas.GetParamStruct(ko_MathPointParam) );
  if ItemPar = nil then
    Exit;
  ItemPar.Init;
  tFont := ksTextItemFont( ItemPar.GetItemFont );
  if ( (cut <> nil) And (tLinePar <> nil) And (tFont <> nil) And (tMathPoint <> nil) ) then begin
    cut.Init;
    tLinePar.Init;
    tFont.Init;
    tMathPoint.Init;

    cut.type_ := 0;
      cut.x1    := 30;
      cut.y1    := 65;
      cut.x2    := 95;
      cut.y2    := 15;
      cut.right := 1;
      cut.str   := 'A$;1$';
      pMathPoint := ksDynamicArray( cut.GetpMathPoint );

     tMathPoint.x := 0;
     tMathPoint.y := 1000;
     pMathPoint.ksAddArrayItem( -1, tMathPoint );

    {   tMathPoint.x := 0;  линия разреза может ,оказывается ,строиться по 3-м точкам.
     tMathPoint.y :=-1000;
     pMathPoint.ksAddArrayItem( -1, tMathPoint );   }

     tMathPoint.x := 0;
     tMathPoint.y := -1000;
     pMathPoint.ksAddArrayItem( -1, tMathPoint );

    obj := idoc2d.ksCutLine( cut );

     idoc2d.ksSetObjParam( obj, cut, ALLPARAM );

   end;
end;

iAssociationViewParam:=ksAssociationViewParam(Kompas.GetParamStruct(ko_AssociationViewParam));
iAssociationViewParam.fileName:=Kompas.ksGetFullPathFromSystemPath(form1.Edit1.Text+'\3d'+'\Головной отсек.a3d', sptLIBS_FILES);
iAssociationViewParam.projBodies:=True;
iAssociationViewParam.projThreads:=True;
iAssociationViewParam.visibleLinesStyle:=1;
iAssociationViewParam.projectionName:='#Слева';
iAssociationViewParam.projBodies:=true;

iAssociationViewParam.section:=false;



iViewParam:=ksViewParam(iAssociationViewParam.GetViewParam);

iViewParam.name:='разрез';
iViewParam.x:=200;
iViewParam.y:=180;
iViewParam.scale_:=0.05;

iViewParam.state:=stCURRENT;
    iViewParam.Init;

   number:=0;

   iDoc2D.ksCreateSheetSectionView(iAssociationViewParam,number,obj);

end;








Alexey001

Этот код работает?