Цилиндрическая спираль как направляющая

Автор sanddream, 22.09.07, 00:51:29

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

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

sanddream

Возможно ли указать программно цилиндрическую спираль как направляющюю при построении элемента по сечениям?
Приведенный ниже код не работает. :(
Цилиндрическая спираль создана
Эскизы сечений добавлены.
...
entityCollection := ksEntityCollection( iPart.EntityCollection(o3d_cylindricSpiral));
iSketchEntity3:=  ksEntity(entityCollection.First);
iBossLoftDefinition.SetDirectionalLine(iSketchEntity3);
...

olden

Маленький совет. Попробуйте выполнить вручную всё то, что вы написали в программном коде.

sanddream


olden

#3
Обманываешь, ай-яй-яй  :um:  :). В iPart.EntityCollection(o3d_cylindricSpiral) находятся 4 Entity. При условии что компас создал сам спираль без твоих эскизов: 0-2 entity - плоскости, 3 - сама спираль.  И из этого у меня ничего не получилось. Я думаю надо делать так (но надо еще проверить): Спираль создать из эскиза (диаметра спирали) и второго эскиза на другой плоскости (высоты спирали). Создать эскиз (начало сечения) на плоскости через вершину перпендикулярную ребру. Тоже сделать с другим эскизом (конец сечения). А после операция по сечениям. Должно получится.
PS. Когда будешь задовать диаметр спирали из эскиза, то нужен entity круга, а не эскиза. Как программно его получить я еще не понял.

olden

А лучше всего спираль создать самому из ломаной. Вот пример для VB6. Разобраться можно:

Public Function CylindricSpiral(step As Double, turn As Double) As Boolean

CylindricSpiral = False

  'step - шаг витков
  'turn - количество витков
 
  Dim x As Double, y As Double, z As Double, radius As Double
  x = 0
  y = 0
  z = 0
  radius = 5
 
  Dim part As Kompas6API5.part
  Set part = iDocument3D.GetPart(pNew_Part)
  If part Is Nothing Then Exit Function
 
  Dim polylineEntity As Kompas6API5.entity
  Set polylineEntity = part.NewEntity(o3d_polyline)
 
  Dim polylineDef As Kompas6API5.PolyLineDefinition
  Set polylineDef = polylineEntity.GetDefinition
 
  polylineDef.AddVertex 5, 0, 0, 0
  z = (turn * step) / (8 * turn)
  step = z
  z = 0
  For i = 1 To turn
      polylineDef.AddVertex 0, 0, z + step * 1, radius
      polylineDef.AddVertex 0, 5, z + step * 2, 0
      polylineDef.AddVertex 0, 10, z + step * 3, radius
      polylineDef.AddVertex 5, 10, z + step * 4, 0
      polylineDef.AddVertex 10, 10, z + step * 5, radius
      polylineDef.AddVertex 10, 5, z + step * 6, 0
      polylineDef.AddVertex 10, 0, z + step * 7, radius
      polylineDef.AddVertex 5, 0, z + step * 8, 0
      z = (step * 8) * i
  Next i
  polylineEntity.Create
CylindricSpiral = True
End Function


sanddream

Может я чего то не понимаю но у меня постояно возникает ошибка "член группы не найден" на строчке
iBossLoftDefinition.SetDirectionalLine(iSketchEntity3);
даже если я пытался указать там не первый элемент из
iPart.EntityCollection(o3d_cylindricSpiral)
И по моему все же в этом массиве 1 элемент.

entityCollection := ksEntityCollection( iPart.EntityCollection(o3d_cylindricSpiral));
  iPart.name:=inttostr(entityCollection.GetCount);
так как после вот этого имя детали - 1

И я что то не понял предложения сделать все вручную и последующее уличение в обмане. 8-)
Вручную -это просто в КОМПАСЕ или нет?
С ломаной надо будет попробовать, но удобнее все таки было бы с цилиндрической спиралью.
Спасибо за информацию.

yarikv

ЦитироватьentityCollection := ksEntityCollection( iPart.EntityCollection(o3d_cylindricSpiral));
iSketchEntity3:=  ksEntity(entityCollection.First);
iBossLoftDefinition.SetDirectionalLine(iSketchEntity3);

для определения  iSketchEntity3 используй метод SelectByPoint

iSketchEntity3:=ksEntity(entityCollection.SelectByPoint);

указав координаты любой точки цилиндрической спирали

если получится выложи пример в теме Исходники...

olden

#7
 :) Имелось ввиду сделать руками в компасе. :) Почему через ломаную? Просто, насколько я понял, многие функции SDK "недоделанные". iPart.EntityCollection(o3d_cylindricSpiral) имеет 1 Entity. Так как iPart(подразумеваем это дерево) у вас построена 1 спираль, а было бы построено 5 спиралей iPart.EntityCollection имело 5 Entity. Теперь ищи нужную спираль. Маленький геморой  ;). Это при условии новосозданного документа "Деталь". А по поводу SelectByPoin - ничего не получится. Мы незнаем какие вершины(точки) у спирали.

olden

Понял. Делаешь так. Создаешь спираль. После фильтруешь дерево на наличее вершин которые относятся к твоей спирали (part.EntityCollection(o3d_vertex)). После нахождения двух вершин (их всего будет две) создаешь две плоскости (part.NewEntity(o3d_planePerpendicular)). На этих плоскостях создаешь эскиз. А после соединяешь эскизы операцией по сечению. Если что-то будет не понятно обращяйся. Другого способа я не нашел.

На vb6 функция фильтрации:
  Dim vertexEntityColl As Kompas6API5.EntityCollection
  Set vertexEntityColl = part.EntityCollection(o3d_vertex)
  i = vertexEntityColl.GetCount
  Dim indexStart As Integer, indexEnd As Integer
  Dim vertexEntity As Kompas6API5.entity
  For i = 0 To i - 1
  Set vertexEntity = vertexEntityColl.GetByIndex(i)
  Dim vertexDef As VertexDefinition
  Set vertexDef = vertexEntity.GetDefinition
  Dim vertexEnt As Kompas6API5.entity
  Set vertexEnt = vertexDef.GetOwnerEntity
  If vertexEnt.name = name Then' сравниваем имя спирали с тем именем что в коллекции
    If indexStart = 0 Then indexStart = i
    If indexStart <> 0 Then indexEnd = i
  End If
  Next i
  Set vertexStart = vertexEntityColl.GetByIndex(indexStart)
  Set vertexEnd = vertexEntityColl.GetByIndex(indexEnd)

sanddream

Кажется я плохо объяснил то, что хочу получить.
Мне нужно построить элемент по сечениям моделирующий собой намотаную нить
Во входных параметрах - диаметр нити и высота цилиндрической спирали.
Все остальное расчитывается. И (повторюсь) проблема в указании цилиндрической спирали
как направляющей.
В приложеном файле модель-заготовка, в которой для завершения нужно указать цилиндрическую спираль направляющей(Компас 8+).

olden

Исходя из вашей модели-заготовки. На экране только два эскиза-сечения и спираль-направляющая. Выполняем операцию по сечениям. Пример на VB6

1 шаг: ищим эскизы.
Public Function FindSketch(part As part, name1 As String, name2 As String, _
                        sketch1 As Entity, sketch2 As Entity) As Boolean

FindSketch = False
  If part Is Nothing Then Exit Function
  Dim entitycoll As Kompas6API5.EntityCollection
  Set entitycoll = part.EntityCollection(o3d_sketch)
  i = entitycoll.GetCount
  Dim Entity As Kompas6API5.Entity
  For i = 0 To i - 1
    Set Entity = entitycoll.GetByIndex(i)
    Dim Def As SketchDefinition
    Set Def = Entity.GetDefinition
    If Entity.name = name1 Then
      Set sketch1 = entitycoll.GetByIndex(i)
    End If
  Next i
  i = entitycoll.GetCount
  For i = 0 To i - 1
    Set Entity = entitycoll.GetByIndex(i)
    Set Def = Entity.GetDefinition
    If Entity.name = name2 Then
      Set sketch2 = entitycoll.GetByIndex(i)
    End If
  Next i
FindSketch = True
End Function

2 шаг: ищем спираль
Public Function FindEdgeCylindricSpiral(part As part, name As String, _
                                     edgeSpiral As Entity) As Boolean

FindEdgeCylindricSpiral = False
  If part Is Nothing Then Exit Function
  Dim edgeEntityColl As Kompas6API5.EntityCollection
  Set edgeEntityColl = part.EntityCollection(o3d_edge)
  Dim indexStart As Integer, indexEnd As Integer
  Dim edgeEntity As Kompas6API5.Entity
  i = edgeEntityColl.GetCount
  For i = 0 To i - 1
    Set edgeEntity = edgeEntityColl.GetByIndex(i)
    Dim edgeDef As EdgeDefinition
    Set edgeDef = edgeEntity.GetDefinition
    Dim edgeEnt As Kompas6API5.Entity
    Set edgeEnt = edgeDef.GetOwnerEntity
    If edgeEnt.name = name Then
      Set edgeSpiral = edgeDef.GetOwnerEntity
    End If
  Next i
FindEdgeCylindricSpiral = True
End Function

3 шаг: выполняем операцию по сечению

FindEdgeCylindricSpiral part, " Спираль цилиндрическая:1", edgeSpiral
FindSketch part, " Эскиз:1", " Эскиз:2", sketch1, sketch2

Dim entityBossLoft As Kompas6API5.Entity
Set entityBossLoft = part.NewEntity(o3d_bossLoft)
Dim bossLoftdef As Kompas6API5.BossLoftDefinition
Set bossLoftdef = entityBossLoft.GetDefinition()
Dim entitycoll As Kompas6API5.EntityCollection
Set entitycoll = bossLoftdef.Sketchs
j = entitycoll.Add (sketch1)
j = entitycoll.Add (sketch2)
j = bossLoftdef.SetDirectionalLine(edgeSpiral)
entityBossLoft.Create

Незнаю это или не это. Но все выполнелось без ошибок.

yarikv

#11
попробовал сделать операцию по сечениям по примеру детали. ведь программно была же сделана цилиндрическая спераль. и есть ее Entity уже определенная, по которой делалась спираль. так ее и надо указывать.

iBossLoftDefinition.SetDirectionalLine(iCylindricSpiral);

пример http://forum.ascon.ru/index.php/topic,5841.msg49673.html#msg49673

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

olden

Возможно, просто пример такой. А если диаметры будут разные? Тогда лучше операция по сечениям. Я не создавал спираль и эскизы, а брал существующие.

sanddream

из API от 8+

ksBaseEvolutionDefinition
методы
GetSketch
GetThinParam
PathPartArray
SetSketch
SetThinParam
ThinParam

Данный интерфейс устарел. Рекомендуется использовать вместо него интерфейс ksBossLoftDefinition.
Вот именно по этой причине элемент я использую операцию по сечениям
Спасибо за помощь.

yarikv

#14
тут наверное ошибка. наверное имели ввиду что нужно использовать BossEvolutionDefinition. та даже если устарел - зачем использовать новый интерфейс если старый работает. при этом делая лишний эскиз

olden

Скорее всего в будущем устаревшие комады выпадут из SDK. Поэтому и пишут что данная команда устарела.

sanddream

Смешно но ошибка у меня была не в коде программы, а в месте положения функции построенгия в тексте программы.
Теперь все замечательно работает. :)