Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.13;
Скачать: CL | DM;

Вниз

Варианты подгрузки кода   Найти похожие ветки 

 
CrHD   (2010-12-19 03:36) [0]

Приветствую.

Для начала в кратце о проекте.
Пишется САПР, используется GLScene, моделируем системы трубопровода.
Есть базовый класс - труба. Задаем габаритные характеристики, выбираем к какой уже существующей трубе присоеденить, строим.

Цели.
Необходимо добавить новые виды труб и соединений, с использованием подгрузки кода извне, т.к. в процессе эксплуатации программы пользователем могут появляться новые типы соединений или разветвителей, которые будет необходимо добавить в программу.
Я так понимаю, прийдется писать новые классы.
Первая мысль - dll. Погуглив на эту тему, стало понятно что с dll не так просто экспортировать целые классы, как процедуры или функции... Мысль пошла дальше: а dll ли мне нужно?

Существуют еще com, ole, activeX, может быть что-то еще, в данной области я совершенно не компетентен, поэтому прошу помощи у Вас.
Какую технологию посоветуете использовать для достижения поставленных целей?

Что бы иметь представление с чем имеем дело
Пример класса простой трубы:
[Code]
TTube=class
   Pipe1:TGLPipe; //Внутренняя стенка
   Pipe2:TGLPipe; //Внешняя (или наоборот)
   Disk1:TGLDisk; //Закупорим пространство между стенками
   Disk2:TGLDisk; //С обоих сторон трубы
   FreeRight,FreeLeft:Boolean; //Какая часть трубы свободна, а какая нет
   HeadX,HeadY,HeadZ,TailX,TailY,TailZ,Length,Diameter,Thickness,vectorX,vectorY,ve ctorZ,prevangle:Real; {Начало, конец, длина, диаметр, толщина, направление свободного конца, угол под которым присоеденили трубу}
   constructor Create(NewLength,NewThickness,NewDiameter,NewHeadX,NewHeadY,NewHeadZ,NewVectorX, NewVectorY,NewVectorZ:real; NewSide:byte; newprevangle:real);
   destructor Destroy; override;
 end;
[/Code]

Создаем:
[Code]
constructor TTube.Create(NewLength,NewThickness,NewDiameter,NewHeadX,NewHeadY,NewHeadZ,NewVe ctorX,NewVectorY,NewVectorZ:real; NewSide:byte; NewPrevAngle:real);
begin
 side:=newside;
 prevangle:=newprevAngle;
 vectorX:=NewVectorX;
 vectory:=NewVectorY;
 vectorz:=NewVectorZ;

 Length:=NewLength;
 headx:=newheadx;
 heady:=newheady;
 headz:=newheadz;

 Diameter:=NewDiameter;
 Thickness:=NewThickness;

 TailX:=HeadX+vectorX*Length;
 TailY:=HeadY+vectorY*Length;
 TailZ:=HeadZ+vectorZ*Length;

 pipe1:=TGLPipe.CreateAsChild(Form1.GLScene1.Objects);
 pipe1.Radius:=Diameter;
 pipe1.Parts:=[ppOutside,ppInside];
 pipe1.Slices:=32;
 pipe1.SplineMode:=lsmLines;

 pipe1.AddNode(headX,headY,headZ);
 pipe1.AddNode(TailX,TailY,TailZ);

 pipe2:=TGLPipe.CreateAsChild(Form1.GLScene1.Objects);
 pipe2.Radius:=Diameter+Thickness;
 pipe2.Parts:=[ppOutside,ppInside];
 pipe2.Slices:=32;
 pipe2.SplineMode:=lsmLines;

 pipe2.AddNode(headX,headY,HeadZ);
 pipe2.AddNode(TailX,TailY,TailZ);


 disk1:=TGLDisk.CreateAsChild(Form1.GLScene1.Objects);
 disk1.Position.SetPoint(HeadX,HeadY,HeadZ);
 disk1.NormalDirection:=ndOutside;
 disk1.InnerRadius:=Diameter;
 disk1.OuterRadius:=Diameter+Thickness;
 disk1.Slices:=32;
 Disk1.TurnAngle:=90;
 if side=0 then
 disk1.PitchAngle:=prevangle-90
 else Disk1.PitchAngle:=prevangle+90;

 disk2:=TGLDisk.CreateAsChild(Form1.GLScene1.Objects);
 disk2.Position.SetPoint(TailX,TailY,TailZ);
 disk2.NormalDirection:=ndinside;
 disk2.InnerRadius:=Diameter;
 disk2.OuterRadius:=Diameter+Thickness;
 disk2.Slices:=32;
 Disk2.TurnAngle:=90;
 if side=0 then disk2.PitchAngle:=prevangle-90
 else Disk2.PitchAngle:=prevangle+90;
end;
[/Code]


 
Leonid Troyanovsky ©   (2010-12-19 08:13) [1]


> CrHD   (19.12.10 03:36)  

> Какую технологию посоветуете использовать для достижения
> поставленных целей?

Тут, видимо, нужен язык описания трубопроводов :)
Может сгодится xml.

Не очень понятно, что за код будут писать юзеры,
но можно поглядеть
http://podgoretsky.com/ftp/Docs/Delphi/Tenser/7/index.html

--
Regards, LVT.


 
Юрий Зотов ©   (2010-12-19 11:02) [2]

> с dll не так просто экспортировать целые классы,
> как процедуры или функции

Совершенно верно. Но вместо обычной DLL можно использовать BPL (решение более простое, но менее универсальное) или COM (решение более сложное, но и более универсальное). Либо действительно изобрести свой язык.


 
_Юрий   (2010-12-19 11:05) [3]

Думаю, надо сделать систему плагинов (dll)
Объявить интерфейс, и дать возможность пользователю его реализовать и зарегистрировать реализацию в системе.

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


 
CrHD   (2010-12-19 11:42) [4]


> Не очень понятно, что за код будут писать юзеры,
> но можно поглядеть
> http://podgoretsky.com/ftp/Docs/Delphi/Tenser/7/index.html


Ненене, юзеры никакого кода писать не будут =)
Юзеры выбирают из того что есть, из тех труб и соединений что мы сделаем при разработки приложения. Они добавляют, редактируют и удаляют детали. Загвоздка в том, как при появлении, допустим, новых ГОСТов, выпустить новую трубу или тип соединения, что бы юзер просто мог подключить файл к программе и она позволяла полностью им использовать новинку в проектировании.


 
Юрий Зотов ©   (2010-12-19 11:52) [5]


> CrHD   (19.12.10 11:42) [4]
> как при появлении, допустим, новых ГОСТов, выпустить новую трубу
> или тип соединения, что бы юзер просто мог подключить файл
> к программе и она позволяла полностью им использовать новинку
> в проектировании.

Плагины (на основе хоть тех же BPL или COM). Информации в Сети полно.


 
шел мимо   (2010-12-20 00:43) [6]

Сделайте универсальный-избыточный класс трубы, с помощью которого можно будет описать все возможные варианты, без подгрузки кода извне.

С подгрузкой кода можно придумать чтонибудь навроде wndproc в winapi, в программе класс заглушка перенаправляющая вызовы в функцию длл с большим case.

Но это всё нужно только если ваши трубы будут отличаться своим поведением, если только внешним видом и характеристиками - например в автокаде есть такое понятие как BlockInsert и Attributes, никакого програмирования тут вообще не надо.


 
шел мимо   (2010-12-20 00:51) [7]

>>HeadX,HeadY,HeadZ,TailX,TailY,TailZ,Length,Diameter,Thickness,vectorX,vectorY, ve ctorZ,prevangle:Real;

очень оригинальный подход для сапр)) больше смахивает на подход для лабораторной. выж упаритесь потом с этими ...X, ...Y, ...Z заюзайте какойнить tvector, благо их в GLScene много всяких



Страницы: 1 вся ветка

Текущий архив: 2011.03.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
3-1254859922
Дмитрий
2009-10-07 00:12
2011.03.13
Нет коннекта с сервером


15-1291114600
Kerk
2010-11-30 13:56
2011.03.13
Как по-английски называется таблица типа "шахматка"?


15-1290775632
digger
2010-11-26 15:47
2011.03.13
IE 7 не показывает png файлы


2-1292790210
radiokarazinec
2010-12-19 23:23
2011.03.13
TImage интересный вопрос


2-1292862496
v_a_belousov
2010-12-20 19:28
2011.03.13
Авторизация в программе