Инструмент для разработки корпоративной САПР

Игорь Бычков Виталий Прусенко Андрей Мазурин

То, что современное конструкторское бюро и производство не могут эффективно развиваться без активного использования информационных технологий, безоговорочно признается уже практически всеми. Бытуют разные мнения поводу необходимой степени автоматизации решаемых конструкторами и технологами задач, выбора компьютерных программ и их внедрения. В настоящее время наибольшим спросом в России пользуются универсальные САПР среднего уровня, разработанные и отлаженные на ряде максимально востребованных пользователями задач. На первом этапе компьютеризации производств здесь вполне возможно получить оптимальные по соотношению «цена/качество» решения, особенно когда речь идет об отечественных программных разработках.

Важной задачей таких внедрений является даже не столько ускорение конструкторско-технологической подготовки производства и повышение эффективности кооперации с другими предприятиями, сколько приобщение российских проектных и производственных отделов к использованию современных компьютерных технологий, доступных каждому инженеру, решающему свою конкретную задачу в проектно-производственном цикле. Более вероятно, что для малых предприятий, завязанных на производство сравнительно небольшой номенклатуры близких по типоразмерам деталей, универсальные САПР среднего уровня будет и впредь вполне достаточно. А вот крупным предприятиям, занимающимся к тому же разработкой новых изделий, очень скоро придется искать иные решения, лучше ориентированные на специфику их производств. И едва ли специалисты там найдут утешение в решениях, предлагаемых CAD/CAM/CAE-системами верхнего уровня. Им захочется многое в них изменить, добавить специфические функции, заложить в них уникальные решения и, таким образом, фактически создать новое программное обеспечение, требующее постоянного развития в соответствии с растущим спросом на рынке готовых изделий и изменяющимися возможностями производства. В противном случае при достижении определенного уровня развития производство в значительной степени начнет сдерживать заложенные в инструмент возможности, которые некогда способствовали его росту.

Направление развития любой универсальной системы определяется исходя из нужд конкретного пользователя, с которым в данный момент работают разработчики программы. Если прогноз в  перспективности новых решений был сделан верно, то со временем «современные» решения станут доступны другим пользователям, которые все равно получат в руки несколько «устаревшие» знания и технологии и неизбежно будут отставать от тех, для кого они впервые были разработаны. К тому
же их использование может оказаться менее эффективными из-за специфики каждого конкретного предприятия-пользователя.

Создание корпоративной системы автоматизированного проектирования, гармонично связанной с автоматизированной системой управления предприятия, предполагает учет всех тонкостей производства и, к слову, вовсе не отрицает интеграцию с универсальными САПР. Такая система доступна и эффективна
только для крупных предприятий, поскольку требует наличия в штате предприятия постоянно действующей группы разработчиков и специалистов, владеющих многолетним опытом, методиками проектирования и технологическими тонкостями изготовления новых изделий. Эффект от использования такой развивающейся системы можно прогнозировать значительный.

Единственным узким местом создания корпоративной САПР при наличии специалистов всех профилей являются ограниченные сроки, установленные на ее разработку и внедрение.

Выход из этой ситуации предлагает французская фирма MATRA Datavision, ведущий международный поставщик технологических решений и услуг в области CAD/CAM/CAE/PDM-систем, которая в конце 1999 года объявила о принятии стратегии открытости исходных текстов уникальной библиотеки Open CASCADE.
Начиная с 2000 года десятки тысяч компаний разработчиков и фирм бесплатно получили в свое распоряжение Open CASCADE, на базе которой уже разработаны и продолжают создаваться сотни новых специализированных программных приложений. Среди программ, полученных с использованием Open CASCADE, есть решения, разработанные и в СНГ (см. «Использование технологий MATRA Datavision для разработки САПР на постсоветском пространстве», «САПР и графика», №12’2000). Одно из них создано на НПФ «АВИаМотоР» (Харьков) — это графический модуль «Океан-CAD», вошедший в состав информационной системы «Океан», успешно эксплуатируемой на заводе уже несколько лет. Благодаря мощным математическим алгоритмам и функциям, заложенными в Open CASCADE, «Океан-CAD» был разработан менее чем за год и уже около двух лет эффективно используется для трехмерного моделирования деталей, сборок и создания рабочих чертежей.

Инструмент разработки САПР

Open CASCADE — это библиотека для геометрического моделирования, полученная на базе С++. Она представляет собой набор функций и объектов для разработки специализированных научно-технических и профессиональных приложений в таких областях, как САПР, метрология, измерительные машины, биомедицина, трехмерная картография, оптика, разработка дизайна внешних форм изделий и т.д.

Open CASCADE мощный инструмент разработчика универсальных и специализированных программных решений. Но, как и всякий инструмент, требует знаний и умелого обращения. К сожалению, пользовательская документация, прилагаемая к Open CASCADE, оставляет желать лучшего, и поэтому на первых порах у пользователей может возникнуть масса вопросов по использованию этого уникального программного продукта. Для того чтобы начинающим пользователям было легче сделать первые шаги, мы предлагаем вашему вниманию одну из публикаций по использованию библиотеки Open CASCADE при разработке компьютерных приложений.

Для начала выясним, где взять библиотеку Open CASCADE, из чего она состоит и как с ней работать.

Ресурсы Open CASCADE

Учитывая современную тенденцию к открытости исходных текстов программных продуктов, MATRA Datavision опубликовала исходные тексты Open CASCADE в сети Internet. Загрузить библиотеки и исходные
тексты Open CASCADE можно, зайдя на Web-сайты: www.opencascade.com и www.opencascade.org.

В настоящее время доступны две версии библиотеки:
1. Open CASCADE 4.0 — новая версия, разработка которой сейчас ведется;
2. Open CASCADE 3.1 — отлаженная и более стабильная в работе версия, предназначенная для использования.

Для изучения возможностей библиотеки рекомендуется использовать версию 3.1. Архив полной версии Open CASCADE для Windows NT/9x занимает 234 Мбайт. В него входят:
• исходные тексты и заголовочные файлы;
• рабочие DLL- и LIB-библиотеки для окончательной и отладочной версии проекта;
• документация;
• примеры и программа Shape Viewer для визуального контроля выполнения операций;
• проекты на Visual C++ с примерами;
• файл setup.exe для удобной установки Open CASCADE;
• мастера Visual C++ для быстрого создания заготовки приложения.

Пользователь может выбрать только то, что ему требуется и загрузить только минимальный объем, необходимый для работы с библиотекой. Исходные тексты могут быть откомпилированы для любой платформы: Linux, UNIX, Windows NT/9x. Для полной компиляции библиотеки для Windows необходимо около 4 Гбайт свободного дискового пространства.

Вся документация разделена на три вида:
• общая информация;
• учебная документация;
• справочная документация.

Общая документация содержит информацию обзорного типа, в которой рассматриваются технические вопросы использования того или иного класса, представлены области применения и даются рекомендации по использованию. Учебная документация содержит в себе описание возможностей модуля. Здесь рассматриваются функциональное назначение и архитектура модуля, основные классы и методы с точки зрения их применения их функций, приводятся советы по использованию и варианты обхода подводных камней. Вся учебная документация поставляется в PDF-формате и требует для просмотра Acrobat Reader, который вы можете бесплатно загрузить с Web-сайта фирмы Adobe.

Справочное руководство по библиотекам CASCADE построено на базе языка C++. Оно объясняет основные правила синтаксиса, в контексте использования, смысл переменных и возвращаемых значений функций, а также возможность использования их совместно с другими функциями. Здесь можно найти описание
всех ошибок и характер их возникновения. Все справочные руководства поставляются в HTML-формате и в формате помощи Windows.

Также в документации можно найти большое количество примеров, выполненных в виде проектов Visual С++. В этих примерах показано, как использовать тот или иной модуль или функцию.

Помощь по классам CASCADE можно вызывать в среде Visual C++ по клавише F1. Для этого необходимо подключить помощь CASCADE, выбрав элемент меню Use extended help в меню Help, интегрированной среды разработки Visual C++. Так вы сможете осуществлять поиск по всем используемым вами функциям, в том
числе функциям Open CASCADE.

При использовании Open CASCADE для Linux, UNIX или Windows NT у пользователей могут возникать проблемы с поиском необходимой информации для решения поставленной задачи. В этом случае вначале следует обратиться к справочному руководству и учебной документации. Если в них ответы найти не
удастся, то можно обратиться с интересующим вопросом на форум пользователей Open CASCADE (www.opencascade.org), либо непосредственно к поставщикам Open CASCADE, например MATRA Datavision Open CASCADE Support.

Создание объектов

Open CASCADE-классы используют все богатство классов C++. Однако разработчиками принят ряд собственных соглашений. Так, имя классов состоит из двух частей, разделенных подчерком. Первая часть имени указывает на принадлежность класса к определенной группе, а вторая — собственное имя класса.
Это позволяет группировать все классы в логические модули. Рассмотрим в качестве примера группу gp — геометрические примитивы. Эта группа содержит такие классы, как gp_Pnt — точка, gp_Circ2d — окружность, gp_Ax2 — ось.

Объекты Open CASCADE похожи на большинство объектов С++, поэтому при создании их мы будем использовать те же самые методы. Для примера приведем код программы, иллюстрирующей процесс создания объекта «точка».

#include <gp_Pnt.hxx>
//Размещаем объект «точка» в статической памяти.
gp_Pnt P(1,2,3);
//Размещаем объект «точка» в динамической памяти.
gp_Pnt *P = new gp_Pnt(1,2,3);

Следует отметить одну из основных особенностей библиотеки Open CASCADE, заложенную при разработке и отличающую ее от библиотек других разработчиков. При разработке архитектуры классов использовались все последние достижения в области распределения памяти и возможности совместного использования указателей на объекты. Так, если пользователь хочет создать 3D-точку, то он имеет

в своем распоряжении два класса: gp_Pnt и Geom_CartesianPoint. Эти два класса были созданы для различных целей. По соглашению каждый пользователь задействует gp_Pnt, когда ему необходимо использовать точку в качестве переменной, как можно видеть на следующем примере.

#include <gp_Pnt.hxx>
gp_Pnt P(1,2,3);
Standard_Real px = P.X();

Так же по соглашению Geom_CartesianPoint используется, когда пользователю требуется точка с расширенными функциональными возможностями, например, возможность совместного использования указателей на объект. Ниже мы приведем пример текста программы, иллюстрирующий создание объекта типа Geom_CartesianPoint, однако заметим, что ни один из способов описания не применяется при программировании в Open CASCADE.

#include<Geom_CartesianPoint.hxx>
//Размещение точки в статической памяти.

Geom_CartesianPoint CP(1,2,3);
//Размещение точки в динамической памяти

Geom_CartesianPoint *CP = new Geom_CartesianPoint(1,2,3);

Для управления объектами Open CASCADE предлагает механизм, известный как handle, наследуемый от MMgt_Tshared-класса. Handle — это дескриптор, который автоматически перераспределяет память. Одним из классов, использующих механизм handle, является Geom_CartesianPoint. Как можно заметить, никто здесь
не принуждает пользователя CASCADE использовать механизм handle или механизм дескрипторов. Однако многие методы и функции объектов используют дескриптор в качестве аргументов и возвращаемых значений функций, поэтому изучение этого механизма все равно необходимо. Приведем пример, иллюстрирующий использование описанного механизма:

#include<Geom_CartesianPoint>
Handle(Geom_CartesianPoint) CP = new Geom_CartesianPoint(1,2,3);

Вызывая методы созданного объекта, оперируя с его дескриптором, следует использовать последовательность ‘->’ (стрелка). Однако, если в случае вызова метода дескриптора следует использовать ‘.’ (точка) для доступа к ним.

Итак, основное назначение дескриптора заключается в хранении количества указателей, созданных на объект, и в автоматическом освобождении памяти в случае, если количество указателей равно нулю. Это огромное преимущество для программиста, поскольку ему не требуется следить за своевременным вызовом функции delete и освобождением памяти «вручную». Использование такого механизма гарантирует своевременное освобождение памяти в часто встречающихся ситуациях, например в таких, как представлено ниже.

//Создадим объект точки P1.>
Handle(Geom_CartesianPoint) Handle1 = new Geom_CartesianPoint(1,2,3);

//Создадим объект точки P2.
Handle(Geom_CartesianPoint) Handle2 = new Geom_CartesianPoint(3,4,5);

//При выполнении операции присвоения, память выделенная под P1 освобождается.
Handle1 = Handle2;

Наряду с этим дескриптор предоставляет ряд широко используемых функций. Например, проверка на нулевой указатель. Эта проверка позволяет узнать, имеется ли объект в действительности или нет, исключив ошибки связанные с неправильным обращением к памяти. Другой функцией является то, что
дескриптору определенного класса можно присвоить объект любого его подкласса.

Эта возможность есть и в существующих указателях. Однако есть и отличие. Например, мы создали функцию Project, имеющую следующее описание:

Hendle(Geom_Curve) Project(const Handle(Geom_Curve)& C, const Handle(Geom_Surface)& S);

Предположим, в качестве параметра Geom_Curve будет подставлен объект подкласса Geom_BSplineCurve. В этом случае результатом функции будет объект того же класса, что и параметр, то есть объект типа Geom_BsplineCurve.

Разрабатывая объекты, можно манипулировать ими или как переменной, или как дескриптором. Когда же следует выбирать один из них? Если создаваемый объект должен существовать долгое время и возникает
необходимость в создании нескольких указателей на объект, то целесообразнее выбрать дескриптор. Память в этом случае для созданного объекта будет выделена из «кучи».

Если объект создается на короткое время и используется, например, для вычислений в несложном алгоритме, то можно использовать его как переменную. В безвыходных ситуациях можно использовать функции распределения памяти new и delete, однако это не рекомендуется.

В интерактивных приложениях очень частой операцией является выбор объекта при помощи мыши, поэтому уделим этому вопросу особое внимание. С возвращением дескриптора суперкласса возникает необходимость узнать, какой в действительности тип у выбранного объекта. Если пользователь знает
действительный тип выбранного объекта, он может преобразовать дескриптор суперкласса в дескриптор этого объекта. Для этого можно использовать статическую функцию DownCast , определенную в классе
Handle_Standard_Transient. Вот пример такого преобразования:

#include<Handle_Standard_Transient.hxx>
#include<Geom_CartesianPoint.hxx>
Handle(Geom_CartesianPoint) CP = new Geom_CartesianPoint(1,2,3);
Handle(Geom_Point) P = CP;
>//Преобразуем супер_класс в подкласс.
Handle(Geom_CartesianPoint) NCP =
Handle(Geom_CartesianPoint)::DownCast(P);
if(NCP.IsNull())
cout<<«Ошибка преобразования типов»<<endl;

Покажем еще одну возможность, применяемую при создании интерактивных приложений. Предположим, пользователю необходимо узнать тип выбранного объекта и в соответствии с ним предпринять какие-либо действия. Для определения типа объекта он может использовать несколько способов. Одним из
них является использование макроса STANDARD_TYPE. Макрос возвращает значение типа Standard_Type, который можно применять в операциях сравнения. Для сравнения следует использовать методы Standard_Type (наследованного от MMgt_Tshared) IsKind и DynamicType. Ниже приведен пример использования этих методов.

#include<Standard_Transient.hxx>
#include<Geom_CartesianPoint.hxx>
>Handle(Geom_CartesianPoint) CP = new Geom_CartesianPoint(1,2,3);
Handle(Geom_Point) P = CP;
//Пример использования IsKind, когда нам требуется объект класса Geom_CartesianPoint.
Standard_Boolean result =
P->IsKind(STANDARD_TYPE(Geom_CartesianPoint));
if(result)
cout<<«P — CartesianPoint»<<endl;
//Пример использования DynamicType, когда нам требуется знать
//что два объекта одного и того же типа.
Handle(Standard_Type) DYNCP = CP->DynamicType();
Handle(Standard_Type) DYNP = P->DynamicType();
result = DYNC->SubType(DYNCP);
if(result) cout<<«P и CP одного типа»<<endl;

***

На этом мы завершаем обзор особенностей библиотеки Open CASCADE, все более широко используемой во всем мире для создания современных научно-исследовательских и производственных компьютерных программ для решения различных задач в науке и технике. В следующей статье предполагается рассказать
об иерархии классов Open CASCADE, и об установке библиотеки для Windows. Мы рассмотрим также пример создания простого Windows-приложения на базе Open CASCADE.

Оставить комментарий

You must be logged in to post a comment.