Хорошо работает такой код:
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;
Требуется сделать так, чтобы вершины квадрата выделились все, а тут получается только по одной.
Вы добавили первое ребро из коллекции в массив 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
Значит кусок кода
-------
if (iCollection_1 <> nil) and
(iCollection_1.SelectByPoint(0, 0, 1)) and //координаты на ребре
(iCollection_1.GetCount > 0 ) then
-------
можно убрать совсем?
Если нужны все рёбра, то можно убрать, если нужны определённые, то нужно искать и добавлять найденные в массив операции скругления.
А можно как-нибудь сделать 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;
Ура получилось!
Сразу четыре скругления за одну операцию!
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;
Всё это можно было сделать компактнее и не нужно забывать о проверках.
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;