Инструмент для разработки корпоративной САПР
Тот факт, что современное конструкторское бюро и собственно производство не могут эффективно развиваться без активного использования информационных технологий, безоговорочно признается уже практически всеми. Бытуют разные мнения относительно необходимой степени автоматизации решаемых конструкторами и технологами задач, выбора компьютерных программ и их внедрения. В настоящее время наибольшим спросом в России пользуются универсальные САПР среднего уровня, разработанные и отлаженные на ряде максимально востребованных пользователями задач. На первом этапе компьютеризации производства здесь вполне возможно получить оптимальные по соотношению «цена/качество» решения, особенно когда речь идет об отечественных программных разработках. Важной задачей таких внедрений являются даже не столько ускорение конструкторско-технологической подготовки производства и повышение эффективности кооперации с другими предприятиями, сколько приобщение российских проектных и производственных отделов к использованию современных компьютерных технологий, доступных каждому инженеру, решающему свою конкретную задачу в проектно-производственном цикле. Более вероятно, что для малых предприятий, связанных с производством сравнительно небольшой номенклатуры близких по типоразмерам деталей, универсальных САПР среднего уровня будет и впредь вполне достаточно. А вот крупным предприятиям, занимающимся к тому же разработкой новых изделий, очень скоро придется искать иные решения, более полно отвечающие специфике их производств. И едва ли специалисты там найдут утешение в решениях, предлагаемых CAD/CAM/CAE-системами верхнего уровня. Им захочется многое в них изменить, добавить специфические функции, заложить туда уникальные решения и таким образом фактически создать новое программное обеспечение, требующее постоянного развития в соответствии с растущим спросом на рынке готовых изделий и изменяющимися возможностями производства. В противном случае по достижении определенного уровня развития производство в значительной степени начнет сдерживаться заложенными в инструмент возможностями, которые некогда способствовали его росту.
Направление развития любой универсальной системы определяется исходя из нужд конкретного пользователя, с которым в данный момент работают разработчики программы. Если прогноз о перспективности новых решений был сделан верно, то со временем «современные» решения станут доступны другим пользователям, которые все равно получат в руки несколько «устаревшие» знания и технологии и неизбежно будут отставать от тех, для кого они были разработаны изначально. К тому же их использование может оказаться менее эффективными вследствие специфики каждого конкретного предприятия-пользователя.
Создание корпоративной системы автоматизированного проектирования, гармонично связанной с автоматизированной системой управления предприятия, предполагает учет всех тонкостей производства и, к слову, вовсе не отрицает интеграцию с универсальными САПР. Такая система доступна и эффективна только для крупных предприятий, поскольку требует наличия в штате предприятия постоянно действующей группы разработчиков и специалистов, владеющих многолетним опытом, методиками проектирования и технологическими тонкостями изготовления новых изделий. Эффект от использования такой развивающейся системы может быть весьма значительным.
Единственным узким местом создания корпоративной САПР при наличии специалистов всех профилей являются ограниченные сроки, установленные на ее разработку и внедрение.
Выход из этой ситуации предлагает французская фирма MATRA Datavision, ведущий международный поставщик технологических решений и услуг в области CAD/CAM/CAE/PDM-систем, которая в конце 1999 года объявила о принятии стратегии открытости исходных текстов уникальной библиотеки Open CASCADE. Начиная с 2000 года десятки тысяч компаний-разработчиков и фирм бесплатно получили в свое распоряжение Open CASCADE, на базе которой уже разработаны и продолжают создаваться сотни новых специализированных программных приложений. Среди программ, полученных с использованием Open CASCADE, есть и решения, разработанные в СНГ (см. «Использование технологий MATRA Datavision для разработки САПР на постсоветском пространстве», «САПР и графика», № 12’2000). Одно из них создано на НПФ «АВИаМотоР» (Харьков) — это графический модуль «Океан-CAD», вошедший в состав информационной системы «Океан», успешно эксплуатируемой на заводе уже несколько лет (http://www.aviamotor.kharkiv.com/). Благодаря мощным математическим алгоритмам и функциям, заложенными в Open CASCADE, «Океан-CAD» был разработан менее чем за год и уже около двух лет эффективно используется для трехмерного моделирования деталей, сборок и создания рабочих чертежей (рис. 1).
Инструмент разработки САПР
Open CASCADE — это библиотека для геометрического моделирования, полученная на базе С++. Она представляет собой набор функций и объектов для разработки специализированных научно-технических и профессиональных приложений в таких областях, как САПР, метрология, измерительные машины, биомедицина, трехмерная картография, оптика, разработка дизайна внешних форм изделий и т.д.
Open CASCADE представляет собой мощный инструмент разработчика универсальных и специализированных программных решений, но, как и всякий инструмент, требует знаний и умелого обращения. К сожалению, пользовательская документация, прилагаемая к Open CASCADE, оставляет желать лучшего, и поэтому на первых порах у пользователей может возникнуть масса вопросов по использованию этого уникального программного продукта. Для того чтобы начинающим пользователям было легче сделать первые шаги, мы предлагаем вашему вниманию одну из публикаций по использованию библиотеки Open CASCADE при разработке компьютерных приложений.
Для начала выясним, где взять библиотеку Open CASCADE, из чего она состоит и как с ней работать.
Ресурсы Open CASCADE
Учитывая современную тенденцию к открытости исходных текстов программных продуктов, MATRA Datavision опубликовала исходные тексты Open CASCADE в сети Internet. Загрузить библиотеки и исходные тексты Open CASCADE можно на Web-сайтах: http://www.opencascade.com/ и http://www.opencascade.org/ (рис. 2).
В настоящее время доступны две версии библиотеки:
- Open CASCADE 4.0 — новая версия, разработка которой сейчас ведется;
- 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 (http://www.opencascade.org/) либо непосредственно к поставщикам Open CASCADE, например MATRA Datavision Open CASCADE Support (рис. 3).
Создание объектов
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.
«САПР и графика» 8'2001