Форум: "Начинающим";
Текущий архив: 2011.03.13;
Скачать: [xml.tar.bz2];
ВнизВарианты подгрузки кода Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c