Schöck
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > ЗмейCAD (версии под 2008, 2010 автокад).

ЗмейCAD (версии под 2008, 2010 автокад).

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 29.09.2011, 11:26 1 | #1
ЗмейCAD (версии под 2008, 2010 автокад).
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,838

Дима_ вне форума Вставить имя

Купил на днях сыну змейку Рубика и меня настольгически "зацепило", но на работе в нее играть как-то неправильно, вот решил родить такую "виртуальную". Писал через ранее связывание COM (поленился) - потому привязка к версии все равно есть - но если кому уж очень надо - скомпилирую под другие версии (если сам не сможет). Порядок работы следующий - запускаете автокад соответствующей версии (желательно пустой), смотрите в начало координат пространства модели и запускаете exe'шник. При работе использует события (реакторы).
Код:
[Выделить все]
//Автор Дмитрий Жуков - сентябрь 2011 года, надеюсь Эрнё Рубик не против.
//#r "Autodesk.AutoCAD.Interop.Common"
//#r "Autodesk.AutoCAD.Interop"
open Autodesk.AutoCAD.Interop.Common
open Autodesk.AutoCAD.Interop
open System
open System.Runtime.InteropServices
open System.Windows.Forms
open System.Drawing
try 
  let acad=Marshal.GetActiveObject("Autocad.Application"):?>AcadApplication
  let doc=acad.ActiveDocument
  let model=doc.ModelSpace
  let Zmey=
    let obr=model.AddLightWeightPolyline([|0.0;0.0;70.7107;70.7107;141.4214;0.0|],Closed=true)
    let reg=(model.AddRegion([|obr|]):?>obj []).[0]:?>AcadRegion
    let colorRed=reg.TrueColor
    let colorBlue=reg.TrueColor
    colorRed.SetRGB(255,0,0)
    colorBlue.SetRGB(0,0,255)
    let prism=model.AddExtrudedSolid(reg,100.0,0.0,TrueColor=colorRed)
    let mirror=prism.Mirror([|0.0;0.0;0.0|],[|10.0;0.0;0.0|]):?>Acad3DSolid
    mirror.Move([|70.7107;-70.7107;0.0|],[|0.0;0.0;0.0|])
    mirror.TrueColor<-colorBlue
    obr.Delete()
    reg.Delete()
    let ret=(Array.concat
              (Array.map2 (fun a b->[|a;b|])
                          (mirror.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])
                          (prism.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])))|>
            Array.map (fun x ->x:?>Acad3DSolid)
    prism.Delete()
    mirror.Delete()
    ret
  let Osi=
    let os=model.AddLine([|70.7107;0.0;50.0|],[|106.0660;35.3553;50.0|],Visible=false)
    let mir=model.AddLine([|35.3553;35.3553;50.0|],[|0.0;70.7107;50.0|],Visible=false)
    let ret=(Array.concat
              (Array.map2 (fun a b->[|a;b|])
                          (mir.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])
                          (os.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])))|> Array.map (fun x ->x:?>AcadLine)
    os.Delete()
    mir.Delete()
    ret
  let Volume= (Array.sum (Zmey |> Array.map (fun x->x.Volume)))*0.9412
  let RotateZmey((zmey:Acad3DSolid []),(osi:AcadLine []),i,ang)=
    let (pt1,pt2)=(osi.[i].StartPoint,osi.[i].EndPoint)
    zmey.[0..i] |> Array.iter (fun x->x.Rotate3D(pt1,pt2,ang))
    osi.[0..i] |> Array.iter (fun x->x.Rotate3D(pt1,pt2,ang))
    zmey.[0..1]|>Array.iter (fun x->x.Update())
  let ZmeyOk()=
    let tmp=Zmey.[0].Copy():?>Acad3DSolid
    tmp.ScaleEntity(tmp.Centroid,0.98)
    try Zmey.[1..]|> Array.iter (fun x -> let x2=x.Copy():?>Acad3DSolid
                                          try x2.ScaleEntity(x2.Centroid,0.98)
                                              tmp.Boolean(AcBooleanType.acUnion,x2)
                                          with _ -> x2.Delete()
                                                    failwith "Хреново, пишут из деревни")
        let ret=if abs(tmp.Volume-Volume)<5000.0
                   then "ЗмейCAD"
                   else "ЗмейCAD - нереальная фигура"
        tmp.Delete()
        ret
    with _ -> tmp.Delete()
              "ЗмейCAD - не удается проверить топологию"
  doc.Regen(AcRegenType.acActiveViewport)
  let form=new Form(Text="ЗмейCAD",TopMost=true,AutoSize=true,
                    SizeGripStyle=SizeGripStyle.Hide,
                    MaximizeBox=false)
  let sb=new HScrollBar(Parent=form,Maximum=Zmey.Length-1,Width=350,LargeChange=1)
  let bp=new FlowLayoutPanel(Parent=form,Top=sb.Bottom,AutoSize=true,Size=Size(0,0))
  let bl=new Button(Parent=bp,Top=sb.Bottom,AutoSize=true,Width=0,Text="<")
  let bo=new Button(Parent=bp,Top=sb.Bottom,AutoSize=true,Width=0,Text="<>")
  let br=new Button(Parent=bp,Top=sb.Bottom,AutoSize=true,Width=0,Text=">")
  let brr=new Button(Parent=bp,Top=sb.Bottom,AutoSize=true,Width=0,Text="0")
  form.Size<-Size(0,0)
  bp.Left<-(form.ClientSize.Width-bp.Right)/2
  form.MaximumSize<-form.Size
  let Animated(i,ang)=
    let a=ang/10.0
    let rec fn(x)=
      if ang<>x then RotateZmey(Zmey,Osi,i,a)
                     fn(x+a)
    fn(0.0)
  let rec Razvorot=function
    | 1 -> ()
    | i -> if abs((Osi.[i].StartPoint:?>float []).[0]-(Osi.[i-2].StartPoint:?>float []).[0]-141.42)>0.1
              then Animated(i-1,Math.PI/2.0)
                   Razvorot(i)
              else Razvorot(i-1)
  let Butfn(ang)=
    (fun _-> try Animated(sb.Value,ang)
                 form.Text<-ZmeyOk()
             with _ -> form.Text<-"Автокад занят")
  bl.Click.Add(Butfn(Math.PI/2.0))
  bo.Click.Add(Butfn(Math.PI))
  brr.MouseDown.Add(fun ev -> if ev.Button=MouseButtons.Right
                                   then form.Text<-"Смотрим и НИЧЕГО не трогаем..."
                                        Razvorot(Zmey.Length-1)
                                        form.Text<-ZmeyOk()
                                   else MessageBox.Show("Разворот змеи по правому щелчку!")|>ignore)
  br.Click.Add(Butfn(Math.PI/ -2.0))
  sb.Scroll.Add(fun _ -> try Zmey|> Array.iter (fun x->x.Highlight(false))
                             Zmey.[sb.Value].Highlight(true)
                             acad.Update()
                         with _ -> ())
  doc.add_SelectionChanged(fun _ -> if doc.PickfirstSelectionSet.Count=1
                                       then let hnd=doc.PickfirstSelectionSet.[0].Handle
                                            match (Zmey|> Array.tryFindIndex (fun x->x.Handle=hnd)) with
                                              |Some(x)->sb.Value<-x
                                                        try Zmey|>Array.iter (fun x->x.Highlight(false))
                                                            Zmey.[x].Highlight(true)with _ ->()
                                              |None->())
  Application.Run(form)
//form.Show()
with _ -> MessageBox.Show("Ошибка инициализации")|>ignore
p.s. Это F#
p.p.s 13:40 Обновил код и архив с программой - исправленна ошибка (оставляла невидимый мусор при невозможности проверить наложения призм).
30.09 - Изменил алгоритм проверки наложений (если у кого напишет - не удалось проверить топологию в этой версии - скинтье мне dwg'шку), добавил кнопу "разворота" змеи в исходное положение.

Миниатюры
Нажмите на изображение для увеличения
Название: ЗмейCAD.JPG
Просмотров: 679
Размер:	31.5 Кб
ID:	66972  

Вложения
Тип файла: rar ЗмейCAD.rar (495.0 Кб, 268 просмотров)
Тип файла: dwg
DWG 2004
ЗмейCAD.dwg (917.5 Кб, 2474 просмотров)

__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 30.09.2011 в 17:00.
Просмотров: 5518
 
Непрочитано 29.09.2011, 11:41
#2
dimitriy_popov


 
Регистрация: 27.07.2010
Сообщений: 25
Отправить сообщение для dimitriy_popov с помощью Skype™


Забавно!!!
__________________
Конструктор КМД, Lisp
dimitriy_popov вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.09.2011, 12:57
#3
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,176
Отправить сообщение для Александр Ривилис с помощью ICQ Отправить сообщение для Александр Ривилис с помощью Skype™


Отлично, что у нас появился первый писатель на F#! Как говорит современная продвинутая молодежь - Респект!
Александр Ривилис на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.09.2011, 21:58
#4
Нефтепроводчик


 
Регистрация: 17.03.2009
Сообщений: 79


Респект!
Нефтепроводчик вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 30.09.2011, 17:04
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Внес обновления\исправления - подробности в 1 посте.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.10.2011, 15:14
#6
ASLYS

Delineante
 
Регистрация: 26.12.2006
Ростов-на-Дону/Madrid
Сообщений: 397
Отправить сообщение для ASLYS с помощью ICQ


у меня на одном компе выдает "Ошибка инициализации", на других запускается нормально. как исправить ошибку?
ASLYS вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.10.2011, 15:16
#7
Серёга - Bilder

проектирование гидротехнических сооружений
 
Регистрация: 20.02.2006
Москва
Сообщений: 5,229


Цитата:
Сообщение от ASLYS Посмотреть сообщение
у меня на одном компе выдает "Ошибка инициализации"
такая же ерунда
Серёга - Bilder вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.10.2011, 15:43
#8
Alkor527


 
Регистрация: 14.10.2010
Пермский край
Сообщений: 894
Отправить сообщение для Alkor527 с помощью ICQ


В 2011 версии можно сделать?
Заранее спасибо
__________________
Да провались это проектирование в пекло
Alkor527 на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 06.10.2011, 16:31
#9
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Цитата:
Отлично, что у нас появился первый писатель на F#!
И скорее всего последний, поскольку язык реально чудовищный!!! ИМХО.
Дима_ по прозвищу lambda - известный садомазохист
__________________
На свете счастья нет, но есть покой и воля.

Последний раз редактировалось Sad Dog, 06.10.2011 в 16:51.
Sad Dog вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 07.10.2011, 10:30
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Цитата:
Сообщение от ASLYS Посмотреть сообщение
у меня на одном компе выдает "Ошибка инициализации", на других запускается нормально. как исправить ошибку?
Ошибка инициализации - если в это время автокад соответствующей версии запущен, то скорее всего он не инициализированн в GAC - в %windir%\assembly должны находиться autodesk.autocad.interop.common.dll и autodesk.autocad.interop.common.dll версий для 2010 - 18.0.0.0, для 2008 - 17.0.54.0.
Цитата:
В 2011 версии можно сделать?
Можно, но для компиляции мне нужны выделенные жирным бибилиотеки соответствующих версий (если 2012 не установлен, то по большей цифре).
Цитата:
И скорее всего последний, поскольку язык реально чудовищный!!! ИМХО.
напишите с аналогичнвм функционалом на любом не "чудовищном" - сравним.
з.ы. это все от лени - по уму конечно для com надо позднее связывание использовать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 07.10.2011 в 10:45.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.10.2011, 11:45
#11
ASLYS

Delineante
 
Регистрация: 26.12.2006
Ростов-на-Дону/Madrid
Сообщений: 397
Отправить сообщение для ASLYS с помощью ICQ


dll вроде как нашел, причина в другом
странно, что работает на всех машинах, кроме моей
PS пробовал и 2010 и 2008
Вложения
Тип файла: pdf imprpant.pdf (361.3 Кб, 244 просмотров)

Последний раз редактировалось ASLYS, 07.10.2011 в 12:20.
ASLYS вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 07.10.2011, 11:54
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Тады не знаю.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 07.10.2011 в 17:38.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 07.10.2011, 18:53
#13
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Цитата:
напишите с аналогичнвм функционалом на любом не "чудовищном" - сравним.
Так в том-то и дело, что с функционалом разобраться не получается. Местами я не могу понять, что за действо разыгрывается.
Например вот это:
Код:
[Выделить все]
let ret=(Array.concat
              (Array.map2 (fun a b->[|a;b|])
                          (mirror.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])
                          (prism.ArrayRectangular(1,13,1,0.0,141.4214,0.0):?>obj [])))|>
            Array.map (fun x ->x:?>Acad3DSolid)
Какая-то смесь лиспа с вижал-бейсиком в перемежку с клинописью |> :?>
Или вот это:
Код:
[Выделить все]
try Zmey.[1..]|> Array.iter (fun x -> let x2=x.Copy():?>Acad3DSolid
                                          try x2.ScaleEntity(x2.Centroid,0.98)
                                              tmp.Boolean(AcBooleanType.acUnion,x2)
                                          with _ -> x2.Delete()
                                                    failwith "Хреново, пишут из деревни")
Всё ИМХО.
__________________
На свете счастья нет, но есть покой и воля.

Последний раз редактировалось Sad Dog, 07.10.2011 в 19:12.
Sad Dog вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 07.10.2011, 22:44
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Так Вы не пытайтесь переписать - так никогда ничему не научитесь, посмотрите как работает и напишите сами, а потом сравните как получилось. В примерах - создаются 2 массива призм ("прямая" и "зеркальная") и "сортируется" последовательно верхний, нижний, верхний... во втором - береться чуть уменьшенная копия (уменьшая из-за проблем обработки автокадом наложений ребер на плоскость - при дальнейшем сложении иногда могут возникнуть ошибки - подозреваю из-за неточности обработки чисел с плавающей точкой - "выясненно" опытным путем) всех призм и складывается в отдельный солид, и если сумарный объем отличается - значит призмы где-то наложились - можно конечно проверить наложения, но тогда надо будет - каждый к каждому - то есть долго. Там где "хреново пишут..." это такой отладочный кусок - на случай что при сложной комбинации автокад все равно сложить не сможет.
p/s/ от бейсика здесь нет вобще ничего у let в F# принципиальное иное действие, ну только-что оператор "."
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > ЗмейCAD (версии под 2008, 2010 автокад).

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен сумматор для Автокад 2008 Ильнур AutoCAD 40 18.04.2011 20:08
не открывается окно управления слоями (диспетчер слоев) автокад 2008 starol AutoCAD 7 30.06.2009 16:42
Проблема с распечаткой файлов, сделанных в учебной версии автокад. amyp555 AutoCAD 1 25.08.2008 14:30
Литература для английской версии АА 2008 Westroy Поиск литературы, чертежей, моделей и прочих материалов 0 18.02.2008 10:50

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||