Помогите с построением 3D модели (Delphi)

Автор yarikv, 30.01.07, 01:16:40

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

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

yarikv

30.01.07, 01:16:40 Последнее редактирование: 30.01.07, 01:27:32 от yarikv
Столкнулся с проблемой создания элемента модели (фаска, или приклеить (вырезать)). Как указать, что необходимо сделать фаску на определенном ребре (грани)? Сам пробовал через ksEntity, но когда запускаю библиотеку несколько раз - каждый раз строит на разных ребрах. Соответствено такая же проблема и при создании элемента выдавливания или вырезания. Может кто помочь примером кода на делфи.

Вот так я делал

svetik

Цитата: yarikv от 30.01.07, 01:16:40
Столкнулся с проблемой создания элемента модели (фаска, или приклеить (вырезать)). Как указать, что необходимо сделать фаску на определенном ребре (грани)? Сам пробовал через ksEntity, но когда запускаю библиотеку несколько раз - каждый раз строит на разных ребрах. Соответствено такая же проблема и при создании элемента выдавливания или вырезания. Может кто помочь примером кода на делфи.


Открыла Ваш библиотечный элемент. Фаска построена на одном из ребер. После завершения построения фаску можно отредактировать - убрать текущее ребро, задать новое ребро или плоскость. Все в панели свойств. Все получается - пробуйте. Чтобы убрать фаску на текущем ребре - щелкните его еще раз, задать новое ребро или плоскость для построения фаски - указать ребро или фаску.

yarikv

Эх. а я думал, что уже помощь подоспела:)
Вручную я и сам могу. даже вот попробывал с помощью библиотеки. только проблема в том, что если несколько раз запустить библиотеку на исполнение - каждый раз строится фаска на разных ребрах. Я бы хотел, чтоб кто то наставил на путьт истинный. При чем нет и в примерах как построить на конкретном ребре фаску. или на грани операцию выдавливания или вычитания - там использовалась плоскость по умолчанию. попробывал взять из примера постоения осей или плоскости через ребро или точки. так там таже проблема - если запустить библиотеку несколько раз - строит по разным вершинам и ребрам (step3d3). очень жду ответа. просто хочется идти дальше, а тут стопор и никуда:)

333

Перед iEntityArray.Add(iEntityCollection.GetByIndex(0));
Нужно вызвать SelectByPoint
Тогда в коллекции останется только нужное ребро

yarikv

а есть ли другие способы определения необходимых конструктивных 3D элементов. или это единственный способ?

еще вопрос - кто знает как открытому текущему чертежу присвоить (или изменить) имя файла? в справке смотрел - там только вроде есть возможность присвоить имя файла чертежу когда его создаешь. может я, что то не так понял?

yarikv

333 спасибо. вроде стало получаться :fr:
а насчет имени файла чертежа вопрос остается в силе :)

yarikv

Попутно еще один вопрос: есть ли возможность программно определить из какого католога была запущена текущая библиотека?

Slaviation

Цитата: yarikv от 08.02.07, 20:21:23
Попутно еще один вопрос: есть ли возможность программно определить из какого католога была запущена текущая библиотека?


//------------------------------------------------------------------------------
//Определить каталог библиотеки
//------------------------------------------------------------------------------
function GetCurrentLibraryDir(strRtwName: string): string;
var
  arLibPath :Array[0..255] of char;
  strLibPath :string;
begin
  if GetModuleFileName(GetModuleHandle(PChar(strRtwName)),arLibPath,SizeOf(arLibPath)-1) <> 0 then
  begin
    strLibPath:=strpas(@arLibPath);
    strLibPath:=ExtractFilePath(arLibPath);
    Result:=strLibPath;
  end else Result:='';
end;

yarikv

Спасибо!!!
Помогите в такой ситуации: для выполнения дальнейших действий библиотеки необходимо вручную указать на требуемую для пользователя грань. Как правильно это реализовать? Ну не могу я разобраться в хелпе - нет толковых примеров. необходим пример!!!

Slaviation

Цитата: yarikv от 09.02.07, 23:38:14
Спасибо!!!
Помогите в такой ситуации: для выполнения дальнейших действий библиотеки необходимо вручную указать на требуемую для пользователя грань. Как правильно это реализовать? Ну не могу я разобраться в хелпе - нет толковых примеров. необходим пример!!!


Объяви экспортную функцию:
function SELECTFILTERPROC(_iEntity: PIDispatch): Boolean; stdcall; 
exports SELECTFILTERPROC Name 'SELECTFILTERPROC';

Определи её как тебе надо:
function  SELECTFILTERPROC(_iEntity: PIDispatch): Boolean; stdcall; export;
begin
    Result:=//Тут фильтруй нужные тебе _iEntity
end;

И вызывай
iSelectedEntity:=ksEntity(iDocument3D.UserSelectEntity(nil,'SELECTFILTERPROC',strPromt,hinstance,nil));



yarikv

Цитироватьfunction  SELECTFILTERPROC(_iEntity: PIDispatch): Boolean; stdcall; export;
begin
    Result:=//Тут фильтруй нужные тебе _iEntity
end;


можно пример для фильтра граней?

Slaviation

Цитата: yarikv от 25.02.07, 21:06:28
Цитироватьfunction  SELECTFILTERPROC(_iEntity: PIDispatch): Boolean; stdcall; export;
begin
    Result:=//Тут фильтруй нужные тебе _iEntity
end;


можно пример для фильтра граней?


Ну если, например, нужно указывать только ребра, то
Result:= (ksEntity(_iEntity).type_ = o3d_edge);
Т.е. в функцию приходит _iEntity, на который наведена мышка. Вот и определяй по его типу и его свойствам нужен он тебе или нет.


Slaviation

если грани, то
Result:= (ksEntity(_iEntity).type_ = o3d_face);

yarikv

Спасибо!
мне интересно откуда можно почерпнуть правильное написание команд. ведь в справке этого нет? неужели все самостоятельно разбираются или только методом тыка до всего этого дойти можно?

Nesh

я тоже искал какие-то учебники или что-то в єтом роде. Уже год, а ничего нет. Есть маленькая книженка. Она под С, и то пол книги сам принцип работы OpenGL :(
А жаль...

Slaviation

Цитата: yarikv от 26.02.07, 23:52:46
Спасибо!
мне интересно откуда можно почерпнуть правильное написание команд. ведь в справке этого нет? неужели все самостоятельно разбираются или только методом тыка до всего этого дойти можно?


Дополнительно к справке есть демонстрационные step'ы. В них много "типовых" решений.

avv

Здравствуйте,
у меня есть пара вопросов, относящихся к этой теме:
1. Если я пытаюсь узнать координаты локальной системы координат в процессе работы программы возникает ошибка "Access violation...". Код такой:
var
...
Koord : ksPlacement;
xl,yl,zl : double;
...
begin
...
koord.GetOrigin(xl,yl,zl);
...
end.
В чем проблема сам понять не могу.
2. При создании фаски возникает ошибка в процессе работы "Недопустимое число параметров", код такой:
var
...
iSketchChamfEntity : ksEntity;
iPart: ksPart;
iSketchDef: ksSketchDefinition;
iChamfer, iEntityArray : ksEntityCollection;
...
begin
...
iSketchChamfEntity := ksEntity(iPart.NewEntity( o3d_chamfer ));
    if iSketchChamfEntity<>nil then
    begin
     iChamferDef := ksChamferDefinition(iSketchChamfEntity.GetDefinition);
     if iChamferDef <> nil then
     begin
      iChamferDef.tangent:=false;
      iChamferDef.SetChamferParam(true,m/2,m/2);
      iEntityArray:=ksEntityCollection(iChamferDef.array_);
      if iEntityArray<>nil then
      begin
       iEntityArray.Add(iChamfer.GetByIndex(0));
       iEntityArray.Add(iChamfer.GetByIndex(1));
       iEntityArray.Add(iChamfer.GetByIndex(2));
       iSketchChamfEntity.Create;
      end;
     end;
    end;
...
end.
За ранее спасибо.

avv

Прошу прощения, первый вопрос я задал не верно. Суть вопроса вот какая: как я могу узнать расстояние от плоскости эскиза (плоскость указывается пользователем) до некоторой базовой плоскости детали, которую я заранее не знаю (ХОУ, YOZ, XOZ)? Или может быть надо чтобы пользователь ещё указывал ту базовую плоскость детали в которой лежит плоскость эскиза?

avv

Прошу не волноваться, все вопросы решил сам

yarikv

Цитироватьесли грани, то
Result:= (ksEntity(_iEntity).type_ = o3d_face);


по этому коду выбираются все типы граней.
а если нужно чтобы выбиралась только плоская или цилиндрическая грань?