Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Основы САПР. CAD CAM CAE

.pdf
Скачиваний:
13
Добавлен:
19.11.2023
Размер:
29.79 Mб
Скачать

Вопросы и задачи

473

Группа методов реализации STEP, части в которой нумеруются с 20, описывает

соответствие между формальными спецификациями STEP и представлением, используемым для реализации STEP. Группа методологии проверки соответст­

вия, части в которой нумеруются с 30, предоставляет информацию о методах

проверкисоответствия программных продуктов стандарту STEP, дает указания

по созданию абстрактных испытательных пакетов и описывает задачи испыта­ тельных лабораторий. Часть 31, описывающая методологию выполнения провер­

ки соответствия, принята в качестве международного стандарта (см. рис. 14.6).

Стандарты STEP уникальны в том отношении, что они делают упор на испыта­ ния и содержат в себе описания методов испытаний.

Группа частей с номерами от 300 (абстрактные испытательные пакеты), состоит

из данных и критериев, используемых для проверки соответствия программнога

продукта, реализующего стандарт STEP, его прикладиому _протоколу. Номера,

присnаиваемые абстрактным испытательным пакетам, превышают номера при­

кладных протоколов ровно на 100. Таким образом, абстрактный испытательный

пакет с номером 303 относится к прикладиому протоколу 203. Более подробную

информацию о STEP можно получить на сайте http://www.nist.gov/sc4.

Сегодня STEP привлекает к себе повышенное внимание, так как ожидается, что

он войдет в систему стандартов технологий CALS (Computeг-aided Acquisition and Logistics Support - Непрерывные поставки и информационная поддержка жизненного цикла продукции) как стандарт обмена данными о продуктах. Цель

инициативы CALS, автором которой является Министерство обороны США, - компьютеризация процесса формирования требований, заказа, эксплуатации,

поддержки и обслуживания систем вооружений, используемых в армии США.

Основное внимание эта инициатива уделяет заданию форматов, которые будут использоваться для хранения и обмена компьютерными данными. Хотя CALS

создавалась для военных целей, она становится промытленным стандартом хра­ нения и обмена компьютерными данными в организации.

Вопросы и задачи

1.Опишите преимущества и недостатки использования стандартного формата

при обмене данными технических требований между различными САПР.

2.Создайте DХF-файл для чертежа из задачи 1.1 к главе 4 с помощью системы

автоматизированной разработки чертежей. Прочитайте этот файл в другой чертежной системе и выведите чертеж на экран. Каковы будут ваши выводы?

3.Создайте IGЕS-файл для объекта из задачи 8 к главе 12, прочитайте этот

файл в другой системе твердотельного моделирования и попытайтесь выпол­

нит следующее.

1)Выведите объект на экран.

2)Рассчитайте центр тяжести объекта.

Какие можно сделать выводы о возможностях IGES по обмену данными

о твердых телах?

4.Опишите преимущества использования STEP в качестве стандарта.

Приложение А

Реализация структуры данных полуребер

В листинге А.1 продемонстрирована реализация структуры данных полуребер,

использованная Мянтюля [106] в системе твердотельного моделирования GWB.

Структура данных реализована на языке С.

Процедура, приведеиная в листинге А.2, - это подпрограмма на С, которая ищет

все ребра, содержащие заданную вершину. Эта процедура показывает, что струк­

тура данных полуребер, показанная в листинге А.1, предоставляет необходимую

информацию о смежности для топологических элементов.

Листинг А.1. Структура данных полуребер, предложенная Мянтюля

typedef

float

 

 

vector[4J:

 

 

typedef

float

 

 

matrix[4][4]:

 

typedef

short

 

 

Id:

 

 

typedef

struct

solid

 

Solid:

 

 

typedef

struct

face

 

Face:

 

 

typedef

struct

loop

 

Loop:

 

 

typedef struct

halfedge

Halfedge:

 

 

typedef

struct

vertex

Vertex:

 

 

typedef struct

edge

 

Edge:

 

 

typedef

union·nodes

 

Node:

 

 

struct solid

 

 

 

 

 

{

 

 

 

 

 

 

 

Id

 

Solidno:

/*

Идентификатор объема */

 

Face

 

*sfaces:

/*Указатель на список граней*/

 

Edge

 

*sedges:

/*Указатель на список ребер*/

 

Vertex

*sverts:

/*Указатель на список вершин */

 

Solid

 

*nexts:

/*Указатель на следующий объем */

Solid

 

*prevs:

/*Указатель на

предыдущий объем

*/

}:

 

 

 

 

 

 

 

struct face

 

 

 

 

 

 

{

 

 

 

 

 

 

 

Id

 

fасепо:

/*

Идентификатор

грани */

 

Solid

 

*fsolid:

!* Обратный указатель на объен */

 

Loop

 

*flout:

!* Указатель на внешнее кольцо */

 

Loop

 

*floops:

/* Указатель на список колец */

 

vector

feq:

 

!* Уравнение грани */

 

Face

 

*пextf:

!* Указатель на следующую грань */

Face

 

*prevf:

!* Указатель на

предыдущую грань

*/

} :

struct loop

{

HalfEdge *ledg:

/*

Указатель

на

кольцо полуребер */

Face

*lface:

/*

Обратный указатель на грань */

Loop

*nextl:

/*Указатель

на

следующее кольцо*/

*/
*/

Реализация структуры данных полуребер

 

 

475

Loop

*prev1:

/*Указатель

на

предыдущее

кольцо*/

 

} :

 

 

 

 

 

 

 

struct edge

 

 

 

 

 

 

{

 

 

 

 

полуребро */

Ha1fEdge *hel:

!* Указатель

на

правое

HalfEdge *he2:

!* Указатель

на

левое

полуребро */

Edge

*пехtе:

/* Указатель

на

следующее

ребро */

Edge

*preve:

!* Указатель

на

предыдущее

ребро */

}:

struct halfedge

{

Edge *edge: Vertex *vtx: Loop *prev1: Ha1fEdge *пexthe: Ha1fEdge *prevhe:

} :

struct vertex

/* Указатель на родительское ребро !* Указатель на начальную вершину /* Обратный указатель на кольцо */ /* Указатель на правое полуребро */ /* Указатель на левое полуребро */

{

ld

vertexno:

/* Идентификатор вершины */

Ha1fEdge

*vedge:

/* Указатель на полуребро */

vector

*vcoord:

/* Координаты вершины */

Vertex

*nextv:

/* Указатель на следующую вершину */

Vertex

*prevv:

!* Указатель на предыдущую вершину */

} :

 

 

union nodes

 

 

{

s:

 

So1id

 

Face

 

Loop

1:

 

HalfEdge

h:

 

Vertex

v:

 

Edge

е:

 

Листинг А.2. Процедура поиска всех ребер, содержащих вершину

#define

mate(he)

(((he) --

(he}->edg->hel) ? \

 

 

(he}->edg->he2

(he)->edg->hel)

void 1ist adjacent edge(V. List)

 

Vertex *V;

-

 

 

 

Edge *1ist[J:

 

 

 

{

*adj:

 

 

HalfEdge

 

 

int

i =

о:

 

 

adj = V->vedge:

 

 

 

if(adj)

do

 

 

 

{

 

 

 

 

1ist[i] = adj->edg:

 

 

i++:

 

 

 

}

 

mate(adj)->nexthe)

!= V->vedge):

whi1e((adj =

e1se printf("Oшибкa\n"):

Приложение Б

Реализация структуры данных

крыльевых ребер

В листинге Б.1 показана структура данных крыльевых ребер, используемая в SNUMOD. Структура данных реализована на языке С.

Листинг Б.l. Реализация структуры данных крыльевых ребер в SNUMOD

typedef struct

snu body

 

Body:

 

 

 

typedef

struct

snu-shell

 

Shell:

 

 

 

typedef

struct

snu-face

 

Face:

 

 

 

typedef

struct

snu=loop

 

Loop:

 

 

 

typedef struct

snu_edge

 

Edge:

 

 

 

typedef

struct

snu_vertex

 

Vertex:

 

 

 

typedef

struct

snu_surface

Surface:

 

 

 

typedef

struct

snu_curve

 

Curve:

 

 

 

typedef

struct

snu_point

 

Point:

 

 

 

struct

snu

body

 

 

 

 

 

{

-

 

 

 

 

 

 

 

i nt

 

 

id:

/*

Идентификатор

тела */

 

Body

 

 

*next:

1* Указатель на следующее тело */

Shell

 

*shell:

1* Указатель на оболочку */

char

 

 

*name:

/*

Указатель на иня тела

*/

} :

 

 

 

 

 

 

 

 

struct

snu

shell

 

 

 

 

 

{

-

 

 

 

 

 

 

 

int

 

 

id:

/*

Идентификатор

оболочки

*/

Body

 

*body:

/* Указатель на тело */

 

Shell

 

*next:

1* Указатель на следующую оболочку */

Face

 

*face:

/* Указатель на

грань

*/

 

}:

 

 

 

 

 

 

 

 

struct

snu

face

 

 

 

 

 

{

-

 

 

 

 

 

 

 

int

 

 

id:

/*

Идентификатор

грани

*/

Shell

 

*shell:

/* Указатель на оболочку */

Face

 

*next:

/* Указатель на слеnующую грань */

Loop

 

*loop:

/* Указатель на кольцо */

Surface

 

*surface:

/*

Указатель на

геометрические данные */

} :

 

 

 

 

 

 

 

 

struct

snu

loop

 

 

 

 

 

{

-

 

 

 

 

 

 

i nt

 

 

id:

/*

Идентификатор

кольца */

Face

 

*face:

/* Указатель на грань */

 

Loop

 

*next:

1* Указатель на следующее кольцо */

Edge

 

*edge:

/* Указатель на ребро */

 

int

 

 

*type:

!*

Тиn кольца */

 

 

 

} :

Реализация структуры данных крыльевых ребер

 

 

477

struct snu

-

edge

 

 

 

 

 

{

 

 

 

 

 

 

int

 

id:

loop:

/* Идентификатор

ребра

*/

Loop

 

*left

/* Указатель

на

левое

кольцо */

Loop

 

*right_loop:

/*Указатель

на

nравое

кольцо */

Edge

 

*left

arm:

/* Указатель

на

левую

руку (левое ребро

-nротив часовой стрелки) */

Edge

*left leg:

/* Указатель на левую ногу (левое ребро

-no часовой стрелке) */

Edge

*right arm:

/* Указатель на nравую руку (nравое ребро

-nротив часовой стрелки) */

Edge

*right

leg:

/* Указатель

на

nравую ногу (nравое ребро

 

 

- no часовой стрелке)

*/

Vertex

*tail

vertex:

/*Указатель

на

хвостовую вершину

-(nредыдущая вершина) */

Vertex

*head vertex: /* Указатель

на головную вершину

 

-

(следующая вершина) */

Curve

*curve:

/* Указатель

на геометрические данные */

} :

 

 

 

struct snu

vertex

 

 

{

-

/* Идентификатор

вершины */

int

id:

Edge

*edge:

/* Указатель на ребро */

Point

*point:

/* Указатель на

геометрические данные */

\ .

Приложение В

ОператорыЭйлера

8.1. Операторы Эйлера, используемые в SNUMOD

8.1.1. MEWLS и KEWLS- создать (уничтожить) ребро,

две вершины, внешнее кольцо и оболочку

Оператор MEWLS вызывается для создания оболочки при первоначальном соз­ дании объема или при добавлении пустоты к существующему объему. В реаль­ ности MEWLS просто выделяет место в памяти под оболочку, объявляя о ее соз­ дании. Он также создает две вершины, ребро между этими вершинами и внешнее кольцо, обходящее вершины в обоих направлениях. Это кольцо будет использо­

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

также грань. Однако геометрическая информация о грани при создании ее опе­ ратором MEVVLS не добавляется, поскольку это всего лишь абстрактная грань, с

помощью которой выделяется требуемая память.1 • Необходимая геометрическая

информация появится, когда начальное ребро по ходу операции моделирования превратится в замкнутую цепочку, содержащую в себе область.

Описание изменения топологии, произведенного оператором MEWLS, иллюст­ рируется схематической диаграммой на рис. В.1. Периферийное кольцо L1 пред­

ставляет собой цепочку, проходящую по маршруту V1-V2-V1 и не содержащую в

себе площади. Площадь появится в ней по ходу моделирования, и соответствую­

щая грань получит необходимую геометрическую информацию.

V2

MEVVLS

Ll

KEVVLS

Sl

Vl

Рис. В.1. Действие оператора MEWLS (KEWLS)

Входные и выходные аргументы оператора MEVVLS могут быть описаны СJiедую­ щим образом:

MEVVLS (8. &El. &Vl. &V2. &Ll. &Sl. Xl. Yl. Zl. Х2. У2. Z2)

1 Выделение места в памяти для тоrюJюrllчсского элемента.

B.l. Операторы Эйлера, используемые в SNUMOD

479

В этом выражении элементы, перед которыми стоит символ &, являются выход­

ными элементами, генерируемыми оператором MEVVLS, а остальные элементы

являются входными. Поэтому данное выражение можно интерпретировать так,

что на объеме В создаются новое ребро Е1, новые вершины V1 и V2 в точках (х1,

у1, z1) и (х2, у2, z2), новое внешнее кольцо L1 и новая оболочка 51. Тот же способ записи мы будем ~спользовать для различения входных и выходных аргументов

в других операторах Эйлера.

Соответственно, обратный оператор KEVVLS может быть описан следующим об­

разом:

KEVVLS (В. El. Vl. V2. Ll. Sl. &Xl. &Yl. &Zl. &Х2. &У2. &Z2)

Обратные операторы весьма полезны для реализации функции Откат, или От­ мена ( Undo ), которая отменяет ранее выполненную операцию моделирования. Именно поэтому большинство систем твердотельного моделирования одновре­ менно реализуют и прямые, и обратные операторы.

8.1.2. MEL и KEL- создать (уничтожить) ребро

и внешнее кольцо

Оператор MEL добавляет ребро Е1, соединяющее вершины V1 и V2 в кольце L1

(рис. В.2). В результате применения оператора MEL исходное кольцо L1 делит­ ся на два новых кольца L1 и L2. Исходное кольцо, которое подвергается делению,

может быть внешним кольцом (рис. В.2, а) или кольцом отверстия (рис. В.2, б). Но просто добавить ребро и кольцо мало: оператор MEL должен обновлять со­ единения ребер в вершинах V1 и V2 и связи ребро-кольцо, чтобы отразить разде­

ление исходного кольца L1 на два новых кольца.

VlL1J

-KEL

 

 

 

 

 

 

 

 

 

Vl

 

 

 

 

 

 

 

-МЕL

 

 

 

 

 

 

 

 

 

 

 

 

а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

МЕL

/

 

 

 

/

 

 

 

 

KEL

 

Г

>[JL2МV'El

 

 

 

 

 

 

 

-

 

 

 

 

Vl

 

v

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б

Рис. 8.2. Действие оператора MEL (KEL)

Входные и выходные аргументы операторов MEL и KEL могут быть описаны сле­

дующим образом (В по-прежнему обозначает объем):

MEL (В. Ll. Vl. V2. &El. &L2) KEL (В. &Ll. &Vl. &V2. El. L2)

480 Приложение В. Операторы Эйлера

8.1.2. MEV и KEV- создать (уничтожить) ребро и вершину

Оператор MEV создает ребро Е1, проходящее от вершины V1 кольца L1 до задан­ ной точки (х, у, z), и добавляет это ребро к кольцу L1 (рис. В.З). Разумеется, в за­ данной точке создается также новая вершина V2. Ребро Е1 может быть добавлено

к внешнему кольцу (рис. В.З, а) или к кольцу отверстия (рис. В.З, б).

-

 

MEV

 

KEV

 

а

 

MEV

 

-KEV

L~V2

б

Рис. В.З. Действие оператора MEV (KEV)

Как и в случае оператора MEL, необходимо обновить связь ребра в вершине V1, чтобы новое ребро Е1 было включено в кольцо L1 (то есть ребро Е1 будет фигу­ рировать дважды в списке ребер, как соединительные ребра, описанные в разде­

ле 5.3.2, когда из обновленной информации о связях будет получен список ребер

кольца L1).

Входные и выходные аргументы операторов MEV и KEV могут быть описаны сле­ дующим образом (В по-прежнему обозначает объем):

MEV (В. Ll. Vl. &El. &V2. Х. У. Z) KEV СВ. &Ll. &Vl. El. V2. &Х. &У. &ZJ

Оператор KEV является обратным по отношению к MEV.

8.1.2. MVE и КVЕсоздать (уничтожить) вершину и ребро

Оператор MVE разделяет ребро Е1, добавляя к нему вершину V1 в точке (х, у, z),

и соответственно заменяет старое ребро Е1 двумя новыми Е1 и Е2 (рис. В.4). По­ этому входные и выходные аргументы операторов MVE и КVЕ могут быть описа­

ны следующим образом (В по-прежнему обозначает объем):

MVE СВ. El. &Vl. &Е2. Х. У. Z)

MVE (В. &El. Vl. Е2. &Х. &У. &Z)

Оператор KVE можно интерпретировать как обратный по отношению к MVE.

Эффекты, показанные на рис. В.4, достигаются путем изменения одной вершины и соседних ребер Е1 и записью аналогичной информации для Е2. Подробности

приведены в листинге В.1, который демонстрирует реализацию оператора MVE

B.l. Операторы Эйлера, используемые в SNUMOD

481

 

 

 

на языке С на основе структуры крыльевых ребер (листинг Б.1). Вьшолне­

ние шагов процедуры в листинге В.1 четко демонстрирует, как реализуются эти

операторы Эйлера. Другие операторы Эйлера могут быть реализованы анало­

гично.

-MVE

KVE

Рис. 8.4. Действие оnератора MVE (КVЕ)

Лисrинг 8.1. Реализация оператора MVE

MVE (8. El. Vl. Е2. х. у. z) Body *В:

Edge *El. Vertex **Vl: Edge **Е2:

douЫe х. у. z:

{

(*Vl) • malloc(sizeof(Vertex)): (*Е2) = malloc(sizeof(Edge)}: (*E2}->tail_vertex = *Vl:

(*E2}->head_vertex = El->head_vertex: (*E2}->right_leg R El: (*E2)->left_leg = El: (*E2)->right_arm = El->right_arm: (*E2)->left_arm = El->left_arm: (*E2)->right_loop = El->right_loop: <*E2)->left_loop = El->left_loop: (*Vl)->edge = *Е2:

(*Vl}->point.x = х: (*Vl)->point.y =у: (*Vl}->point.z • z: El->right_arm = El->left_arm = *Е2:

El->head_vertex = *Vl:

8.1.5.МЕКН и КЕМН -создать (уничтожить) ребро

иуничтожить (создать) кольцо отверстия

Оператор МЕКН соединяет внешнее кольцо и кольцо его отверстия, добавляя ребро, в результате чего получается одно внешнее кольцо (рис. B.S, а), либо со­

единяет два кольца отверстия в одно кольцо отверстия (рис. B.S, б). Если гово­

рить точнее, он соединяет вершину V1 кольца L1 с вершиной V2 кольца V2, добав­

ляя между ними ребро Е1, и изменяет кольцо L1 так, чтобы оно включало l2.

Таким образом, входные и выходные аргументы операторов МЕКН и КЕМН могут

быть описаны так:

МЕКН (8. Vl. V2. Ll. L2. &El) КЕМН (8. &Vl. &V2. &Ll. &L2. El)

Оператор КЕМН можно интерпретировать как обратный по отношению к МЕКН.

Соседние файлы в папке книги