Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1292760230
RUu
2010-12-19 15:03
2011.03.13
о сравнении дат в SQL


2-1292907366
RUu
2010-12-21 07:56
2011.03.13
перечислить таблицы


2-1292936617
adigozelov
2010-12-21 16:03
2011.03.13
Struktur db


15-1290806981
Юрий
2010-11-27 00:29
2011.03.13
С днем рождения ! 27 ноября 2010 суббота


15-1291052230
polkin
2010-11-29 20:37
2011.03.13
SHA1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский