• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Выделение множества точек на эскизе для скругления

Автор Zentrum, 08.11.12, 21:36:01

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

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

Zentrum

Хорошо работает такой код:

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
              if (iCollection_1 <> nil) and
                 (iCollection_1.SelectByPoint(0, 0, 1)) and    //координаты на ребре
                 (iCollection_1.GetCount > 0 ) then
              begin

                iFilletEntity := ksEntity(iPart.NewEntity( o3d_fillet ));

                if iFilletEntity <> nil then
                begin
                  iFilletDef := ksFilletDefinition(iFilletEntity.GetDefinition);

                  if iFilletDef <> nil then
                  begin
                    iFilletDef.Radius := 5; // радиус скругления
                    iFilletDef.Tangent := false; // продолжить по касательной

                    iEntityArray := ksEntityCollection( iFilletDef.Array_ ); // динамический массив объектов

                    if iEntityArray <> nil then
                    begin
                        iEntityArray.Add( iCollection_1.GetByIndex(0) );
                      iFilletEntity.Create;
                    end;
                  end;
                end;
              end;

А почему не работает так? Совсем ничего визуально не изменяется:

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
              if (iCollection_1 <> nil) and
                 (iCollection_1.SelectByPoint(0, 0, 1)) and    //координаты на ребре
                 (iCollection_1.SelectByPoint(10, 0, 1)) and
                 (iCollection_1.SelectByPoint(0, 10, 1)) and
                 (iCollection_1.SelectByPoint(10, 10, 1)) and
                 (iCollection_1.GetCount > 0 ) then
              begin

                iFilletEntity := ksEntity(iPart.NewEntity( o3d_fillet ));

                if iFilletEntity <> nil then
                begin
                  iFilletDef := ksFilletDefinition(iFilletEntity.GetDefinition);

                  if iFilletDef <> nil then
                  begin
                    iFilletDef.Radius := 5; // радиус скругления
                    iFilletDef.Tangent := false; // продолжить по касательной

                    iEntityArray := ksEntityCollection( iFilletDef.Array_ ); // динамический массив объектов

                    if iEntityArray <> nil then
                    begin
                        iEntityArray.Add( iCollection_1.GetByIndex(0) );
                      iFilletEntity.Create;
                    end;
                  end;
                end;
              end;

Требуется сделать так, чтобы вершины квадрата выделились все, а тут получается только по одной.

#1
Вы добавили первое ребро из коллекции в массив iEntityArray.Add( iCollection_1.GetByIndex(0) );
Создайте цикл и добавьте все ребра из коллекции
for I:=0 to iCollection_1.GetCount-1 do iEntityArray.Add(iCollection_1.GetByIndex(I));

Следующий код неверен, SelectByPoint - Исключить из массива все объекты, не содержащие точку с заданными координатами, т.е. после первого оператора в массиве в лучшем случае один элемент, после второго ноль элементов, всё остальное уже лишнее.
if (iCollection_1 <> nil) and
                 (iCollection_1.SelectByPoint(0, 0, 1)) and    //координаты на ребре
                 (iCollection_1.SelectByPoint(10, 0, 1)) and
                 (iCollection_1.SelectByPoint(0, 10, 1)) and
                 (iCollection_1.SelectByPoint(10, 10, 1)) and
                 (iCollection_1.GetCount > 0 ) then

Zentrum

Значит кусок кода
-------
              if (iCollection_1 <> nil) and
                 (iCollection_1.SelectByPoint(0, 0, 1)) and    //координаты на ребре
                 (iCollection_1.GetCount > 0 ) then
-------
можно убрать совсем?

Если нужны все рёбра, то можно убрать, если нужны определённые, то нужно искать и добавлять найденные в массив операции скругления.

Zentrum

А можно как-нибудь сделать iCollection_2, оставить отдельный элемент с помощью SelectByPoint, скопировать в iCollection_1, затем снова оставить только то, что не вырезается функцией SelectByPoint, опять добавить в iCollection_1, а затем создать скругление? Если вас не затруднит, подскажите такой код.

Вы создали коллекцию рёбер
iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
нашли ребро или рёбра
if (iCollection_1 <> nil) and (iCollection_1.SelectByPoint(0, 0, 1)) and    //координаты на ребре
  (iCollection_1.GetCount > 0 ) then
осталось добавить в массив операции скругления всё, что осталось в iCollection_1.
for I:=0 to iCollection_1.GetCount-1 do iEntityArray.Add(iCollection_1.GetByIndex(I));
Очистить iCollection_1 и повторить код, для поиска другого ребра.
iCollection_1.Clear;

Zentrum

Ура получилось!
Сразу четыре скругления за одну операцию!

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
iCollection_1.SelectByPoint(0, 0, 1);
iFilletEntity := ksEntity(iPart.NewEntity( o3d_fillet ));
iFilletDef := ksFilletDefinition(iFilletEntity.GetDefinition);
iFilletDef.Radius := 5;
iFilletDef.Tangent := false;
iEntityArray := ksEntityCollection( iFilletDef.Array_ );
iEntityArray.Add( iCollection_1.GetByIndex(0) );

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
iCollection_1.SelectByPoint(0, 10, 1);
iEntityArray := ksEntityCollection( iFilletDef.Array_ );
iEntityArray.Add( iCollection_1.GetByIndex(0) );

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
iCollection_1.SelectByPoint(10, 10, 1);
iEntityArray := ksEntityCollection( iFilletDef.Array_ );
iEntityArray.Add( iCollection_1.GetByIndex(0) );

iCollection_1 := ksEntityCollection(iPart.EntityCollection( o3d_edge ));
iCollection_1.SelectByPoint(10, 0, 1);
iEntityArray := ksEntityCollection( iFilletDef.Array_ );
iEntityArray.Add( iCollection_1.GetByIndex(0) );

iFilletEntity.Create;

#7
Всё это можно было сделать компактнее и не нужно забывать о проверках.

iFilletEntity:=ksEntity(iPart.NewEntity(o3d_fillet));
iFilletDef:=ksFilletDefinition(iFilletEntity.GetDefinition);
iFilletDef.Radius:=5;
iFilletDef.Tangent:=False;
iEntityArray:=ksEntityCollection(iFilletDef.Array_);
if iEntityArray<>nil then for I:=1 to 4 do
begin
   iCollection_1:=ksEntityCollection(iPart.EntityCollection(o3d_edge));
   if iCollection_1<>nil then
    begin
        case I of
         1:iCollection_1.SelectByPoint(0,0,1);
         2:iCollection_1.SelectByPoint(0,10,1);
         3:iCollection_1.SelectByPoint(10,10,1);
         4:iCollection_1.SelectByPoint(10,0,1);
        end;
       if iCollection_1.GetCount<>0 then iEntityArray.Add(iCollection_1.GetByIndex(0));
    end;
end;
iFilletEntity.Create;