отрисоввка прарметрической 3D модели
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > отрисоввка прарметрической 3D модели

отрисоввка прарметрической 3D модели

Ответ
Поиск в этой теме
Непрочитано 11.05.2008, 10:53 #1
отрисоввка прарметрической 3D модели
bv7
 
инженер ОПС
 
Березники
Регистрация: 10.05.2008
Сообщений: 13

Доброе все мвремя суток. Гуру, нажна ваша консультация, преподавательница сказала написать программу по отрисовке объекта, до этого АС и Лисп вообще не учил. Лисп нам преподавали в течение 16 часов с перерывами между парами. Пересказали ведение из учебника пару раз, рассказали про функции, штук пять, при этом про некоторые атрибуты функций отозвались, "нафига они вообще непонятно" выдали чертежи и сказали пЕшыте.
Вот кусок кода который задаёт координаты точек, по ним в дальнейшем строится линия. Тока я чёт не то делаю потому что лисп ругется и ни чего рисовать не хотит.
Код:
[Выделить все]
(defun 3D()
(GetReal ("введи диаметр d = "))
(GetInt (Введи кол-во зубцов "z = "))
(GetInt (Введи шаг зубца "а = "))
(setq рt0(0, 0))
(setq р1(* 3 d))
(setq pt1(pt0, p1))
(setq р2(* 0.5 d))
(setq pt2(pt, p2))
(setq р3(* 2 d))
(setq pt3(pt2, p3))
(command "_line" pt0,pt1,pt2,pt3)
)
В итоге программа должна запросить у пользователя цифры, и на их остновании нарисовать объект, затем повернуть обект вокруг оси на 360 градусов, чтобы получить 3D, Предусмотреть тонирование и зуммирование детали.

Вложения
Тип файла: dwg
DWG 2004
Рисунок1.dwg (44.4 Кб, 1251 просмотров)


Последний раз редактировалось bv7, 12.05.2008 в 20:44. Причина: замена вложения
Просмотров: 8413
 
Непрочитано 11.05.2008, 14:47
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Кто ЭТО сочинил?
Profan вне форума  
 
Автор темы   Непрочитано 11.05.2008, 17:44
#3
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Кто ЭТО сочинил?
Я это сочинил, по тем примерам что нам давали, немного их изменив, все изменение состояло в том, что в качестве координат использовал переменную, в переменную соответственно до этого передаю вычисленное значение. Что я не так делаю?
P.S. тут тока начальный кусок кода, если уже этот не рабобтает смысл дальше писать.

Последний раз редактировалось bv7, 11.05.2008 в 18:08.
bv7 вне форума  
 
Непрочитано 11.05.2008, 18:17
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Да здесь столько "не так", что просто челюсть отвисла. И это только кусок кода?
Вот так должны выглядить строки с функциями (get***):
Код:
[Выделить все]
 
...........................................................
(setq d (GetReal "\nВведи диаметр d = "))
(setq z (GetInt "\nВведи кол-во зубцов z = "))
(setq a (GetInt "\nВведи шаг зубца а = "))
............................................................
Чехарда с координатами - полная чепуха.
Profan вне форума  
 
Автор темы   Непрочитано 11.05.2008, 20:14
#5
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


а как реализовать отрисовку по координатам, чтобы использовались только d, z, a.
Все равно не получается, строки с get... поправил, и всеравно ругается "ошибка: no function definition:PT0" это я так понимаю неверно заданы координаты точки, а как их туда передавать то?
Сперва выражение посчиталось, это значение передалось переменной и эта переменная уже участвует в построении объекта. Во вложении нарисовано, что должно в итоге получиться, только ещё объём доюавить надо.
Я же пока пытаюсь нарисовать хотя бы пару линий от этого обекта.
bv7 вне форума  
 
Непрочитано 11.05.2008, 21:47
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А что, у вас нет никакой литературы по AutoLisp? Можно, конечно, переписать за вас весь код - только это никому не интересно, даже вам, если вы не знаете элементарных функций. Вот попробуйте расшифровать выражение
Код:
[Выделить все]
 
(setq pt1(pt0, p1))
Profan вне форума  
 
Автор темы   Непрочитано 11.05.2008, 22:12
#7
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Profan Посмотреть сообщение
Код:
[Выделить все]
 
(setq pt1(pt0, p1))
переменной pt1 присваиваются значения pt0 и p1.

ну да ... нелогично, сам вижу, а как тогда реализовать задуманное, как передать координаты точки по х и по у?
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.

Последний раз редактировалось bv7, 11.05.2008 в 22:18.
bv7 вне форума  
 
Непрочитано 11.05.2008, 22:25
#8
Дима_

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


(setq pt1 (list x y))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 11.05.2008, 23:02
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Сделать, что ли?
---
Добавлено: размеры указаны далеко не все. Это так, для справки.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.05.2008, 00:43
#10
Дима_

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сделать, что ли?
Да если ты сделаешь, то тот преподователь навряд-ли пока не запустит поймет что это за лямбды в перепешку с vla и dfx'ом, да и когда запустит вряд-ли поймет, какое они отношение к лиспу имеют. И господину BV7 точно "провал" светит.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 12.05.2008, 20:29
#11
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Товарищи, на мой взгляд мы все дальше удаляемся от темы, помогите пожалуйста. По словам преподавателя эта задачка лёгкая, по отношению к другим заданиям, тока с её методами преподавания, она становится архи сложной. Чесслово я уже всесь запутался, помогите пожалста.
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Непрочитано 12.05.2008, 20:55
#12
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сделать, что ли?
Учти, это ведь только кусок кода.
И непонятно, что предполагается делать с переменными p1, p2. p3.
А переменнные z и a вообще в этом коде не используются.
Profan вне форума  
 
Автор темы   Непрочитано 12.05.2008, 21:43
#13
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Задача стоит так: отрисовать трёхмерную параметрическую модель детали (См. вложение). Отрисовка происходит по задаваемым пользователем значениям.
Я над этим рисунком детали уже недели 3 бьюсь, силы на исходе, нифига не получается. Справку АвтоКАДа обчитался уже, примеры в Самоучителе по АвтоКАДу теже самые, рисуют парковую дорожку, при чём такими средствами, про которые нам и не говорили совсем.
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Непрочитано 13.05.2008, 00:30
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Блин, а габариты кто задавать будет? Пушкин? Вот тебе вариант, если разберешься. Говорю сразу - контроля правильности ввода никакого; кое-что сделано на командах (хотя это и не совсем правильно, но в данном случае покатит), код можно упрощать и ускорять до невозможности.
Код:
[Выделить все]
(defun test (/ diam range step tmp tmp_pt fit rad pt_lst sub)
  (if (and (setq diam (getdist "\nДиаметр : "))
           (setq range (getint "\nКоличество зубьев : "))
           (setq step (getdist "\nШаг зубца : "))
           ) ;_ end of and
    (progn
      (setq fit    10. ; Принятое значение фаски
            rad    (* 0.15 diam)
            sub    60. ; Принятое падение
            step   (/ step 2.)
            pt_lst (append
                     (list
                       (list 10 fit diam)
                       (list 10 0. (+ diam fit))
                       (list 10 0. (* 4. diam))
                       (list 10 (* 0.5 diam) (* 4. diam))
                       (list 10 (* 0.5 diam) (+ (- (* 4. diam) sub) rad))
                       (cons 42 (setq tmp (/ (sin (setq tmp (/ pi 8.))) (cos tmp))))
                       (list 10 (+ (* 0.5 diam) rad) (- (* 4. diam) sub))
                       (list 10 (- (* 2.5 diam) rad) (- (* 4. diam) sub))
                       (cons 42 tmp)
                       (cons
                         10
                         (setq
                           tmp_pt (list (* 2.5 diam) (+ (- (* 4. diam) sub) rad))
                           ) ;_ end of setq
                         ) ;_ end of cons
                       (cons 10 (setq tmp_pt (polar tmp_pt (/ pi 2.) (- diam rad))))
                       (cons 10 (setq tmp_pt (polar tmp_pt 0. diam)))
                       (cons 10
                             (setq tmp_pt (polar tmp_pt (* pi 1.5) (- diam rad)))
                             ) ;_ end of cons
                       (cons 42 tmp)
                       (cons 10
                             (setq tmp_pt (list (+ rad (car tmp_pt))
                                                (- (cadr tmp_pt) rad)
                                                ) ;_ end of list
                                   ) ;_ end of setq
                             ) ;_ end of cons
                       (cons 10 (setq tmp_pt (polar tmp_pt 0. (- (* 2. diam) rad))))
                       ) ;_ end of list
                     ((lambda (/ res)
                        (repeat range
                          (setq res (append res
                                            (list
                                              (cons 10
                                                    (setq tmp_pt
                                                           (list (+ (car tmp_pt) step)
                                                                 (+ (cadr tmp_pt) step)
                                                                 ) ;_ end of list
                                                          ) ;_ end of setq
                                                    ) ;_ end of cons
                                              (cons 10
                                                    (setq tmp_pt
                                                           (list (+ (car tmp_pt) step)
                                                                 (- (cadr tmp_pt) step)
                                                                 ) ;_ end of list
                                                          ) ;_ end of setq
                                                    ) ;_ end of cons
                                              ) ;_ end of list
                                            ) ;_ end of append
                                ) ;_ end of setq
                          ) ;_ end of repeat
                        (setq tmp_pt (cdr (last res)))
                        res
                        ) ;_ end of lambda
                      )
                     (list
                       (cons 10 (setq tmp_pt (polar tmp_pt 0. (- diam rad))))
                       (cons 42 tmp)
                       (cons 10
                             (setq tmp_pt
                                    (list (+ (car tmp_pt) rad) (+ (cadr tmp_pt) rad))
                                   ) ;_ end of setq
                             ) ;_ end of cons
                       (cons
                         10
                         (setq
                           tmp_pt (polar tmp_pt (/ pi 2.) (- (* 4. diam) fit rad))
                           ) ;_ end of setq
                         ) ;_ end of cons
                       (cons 10
                             (setq tmp_pt
                                    (list (+ (car tmp_pt) fit) (+ (cadr tmp_pt) fit))
                                   ) ;_ end of setq
                             ) ;_ end of cons
                       (cons
                         10
                         (setq tmp_pt (polar tmp_pt 0. (- (* 1.5 diam) (* 2. fit))))
                         ) ;_ end of cons
                       (cons 10
                             (setq tmp_pt
                                    (list (+ (car tmp_pt) fit) (- (cadr tmp_pt) fit))
                                   ) ;_ end of setq
                             ) ;_ end of cons
                       (cons
                         10
                         (setq tmp_pt (polar tmp_pt (* 1.5 pi) (- (* 4. diam) fit)))
                         ) ;_ end of cons
                       (cons 10 (setq tmp_pt (polar tmp_pt 0. diam)))
                       (cons 10
                             (setq tmp_pt
                                    (list (+ (car tmp_pt) (* 0.5 diam)) (* 2. diam))
                                   ) ;_ end of setq
                             ) ;_ end of cons
                       (cons 10 (setq tmp_pt (polar tmp_pt 0. (* 0.5 diam))))
                       (cons 10 (polar tmp_pt (* 1.5 pi) (- diam fit)))
                       (cons 10 (list (- (car tmp_pt) fit) diam))
                       ) ;_ end of list
                     ) ;_ end of list
            ent    (entmakex
                     (append
                       (list
                         '(0 . "LWPOLYLINE")
                         '(100 . "AcDbEntity")
                         '(100 . "AcDbPolyline")
                         (cons 90 (length pt_lst))
                         '(70 . 1)
                         '(43 . 0.)
                         '(38 . 0.)
                         '(39 . 0.)
                         ) ;_ end of list
                       pt_lst
                       ) ;_ end of apply
                     ) ;_ end of entmakex
            ) ;_ end of setq
      (command "_.revolve" ent "" "_none" '(0. 0.) "_none" '(100. 0.) 360.)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
---
Добавлено:
В аттаче красным выделены те габариты, которые я не понял где задаются.
Вложения
Тип файла: dwg
DWG 2004
Рисунок1-1.dwg (59.2 Кб, 670 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.05.2008, 17:55
#15
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Спасибо огромное за вариант, sub можно принять равным диаметру, ... только где это в коде поправить? Теперь буду с кодом разбираться, комментарии писать, ток наверно "без бутылки не разобраться".
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Непрочитано 13.05.2008, 21:10
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Ну, во-первых, проглядев код повнимательнее, сразу увидишь, где назначается sub и чему оно равно. Во-вторых, не "без бутылки", а "без DXF Reference"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.05.2008, 22:51
#17
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


прошу прощения за своё невежество, а что такое DXF Reference
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Непрочитано 14.05.2008, 22:44
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


См.изображение
Миниатюры
Нажмите на изображение для увеличения
Название: 001.jpg
Просмотров: 119
Размер:	64.9 Кб
ID:	6423  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.05.2008, 16:45
#19
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


сенкс
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Непрочитано 15.05.2008, 22:43 Я в отчаянии, помогите...
#20
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


Приветик всем. Очень нужна ваша помошь мальчики, уже не знаю что делать... У меня проблема как и у BV7, т.к. учимся вместе (спасибо ему что посоветовал ваш форум). На уроках нам выдали, наверно минимум основы - defun, setq, command, ну может ещё пару команд и задание. Здавать надо уже на этой неделе, а написать программу так и не могу. Из языков программирования учила то Бейсик и Паскаль, и те в школе. Из того, что смогла понять из программы BV7 и своих соображений, получилось нечто вроде этого:

Код:
[Выделить все]
(defun c:auto ()
 (if (and (setq b (getint "\nВведите длинну: "))
          (setq h (getint "\nВведите ширину: "))
          )
  (progn
      (setq r 0.50)
      (setq pt1 '(0 100))
      (setq pt2 '(0 125))
      (setq pt3 '(40 125))
      (setq pt4 '(40 15))
      (setq pt5 '(90 15))
      (command "_line" pt1 pt2 pt3 pt4 pt5 "_C")
      (setvar "FILLETRAD" r)
      (command "_fillet" pt4 15 pt5)
  )
 )
)
Строго не судите, но дальше никак сдвинутся не могу - связка угла между 2 линиями почему то не получается. И вы делаете с помощью команды list - нам её не давали и я не совсем понимаю как она работает. Получится должно нечто вроде этого auto.dwg . Буду всем очень признательна за малейшую помошь и объяснения
Ju1iya вне форума  
 
Непрочитано 15.05.2008, 23:05
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


А если (без анализа кода) заменить строку
Код:
[Выделить все]
(command "_line" pt1 pt2 pt3 pt4 pt5 "_C")
на
Код:
[Выделить все]
(command "_line" "_none" pt1 "_none" pt2 "_none" pt3 "_none" pt4 "_none" pt5 "_C")
Чего получится? Ну и _.fillet аналогичным образом...
И потом, в указанном коде никак не участвуют ни b, ни h. Так и задумано или как?
И еще один момент, что называется, "от греха": все переменные сделать локальными я бы порекомендовал.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.05.2008, 08:18
#22
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


Как я поняла, с помошью "_none" создаются отдельные отрезки, а не один как раньше было у меня. Но "_.fillet" так и не работает
Код:
[Выделить все]
(defun c:auto ()
 (progn
     (setq b (getint "\nВведите длинну: "))
     (setq h (getint "\nВведите ширину: "))
     (setq r 0.50)
     (setq pt1 '(0 100))
     (setq pt2 '(0 125))
     (setq pt3 '(40 125))
     (setq pt4 '(40 15))
     (setq pt5 '(90 15))
     (command "_line" "_none" pt1 "_none" pt2 "_none" pt3 "_none" pt4 "_none" pt5 "_C")
     (setvar "FILLETRAD" r)
     (command "_.fillet" pt4 pt5)
 )
)
И насколько я понимаю пользваться (setq pt2 '(0 125)), ..., не совсем правильно, а если точнее совсем не правильно. А b и h написала для будещего - по ним задаётся длинна и ширина фигуры, можете посмотреть в приложенном файле.
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 10:36
#23
Дима_

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


Поняла ты не правильно, с помощью none отключаються привязки, а _fillet'ом надо не точки (как у тебя), а отрезки указывать. Вместо (setq pt '(0 100)) писать (setq pt (list x y)) где х и y предварительно подсчитанные значения координат по соответствующим осям.
P.S. (setq a b) (setq c d) ... можно заменить (setq a b c d), а вообще либо найди книжку по лисп, либо участника форума с твоего города, и всей группой ему на ящик пива сбрасывайтесь.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.05.2008, 10:41
#24
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 310


>> Ju1iya
Если попробовать вот так:
Код:
[Выделить все]
(defun c:auto (/ p_snapmode p_blipmode p_osmode)
 (setq p_snapmode (getvar "SNAPMODE")
       p_blipmode (getvar "BLIPMODE")
       p_osmode (getvar "OSMODE")
 )
 (setvar "SNAPMODE" 0)
 (setvar "BLIPMODE" 0)
 (setvar "OSMODE" 0)


     (setq b (getint "\nВведите длинну: "))
     (setq h (getint "\nВведите ширину: "))
     (setq r 0.50)
     (setq pt1 '(0 100))
     (setq pt2 '(0 125))
     (setq pt3 '(40 125))
     (setq pt4 '(40 15))
     (setq pt5 '(90 15))
     (command "_line" pt1 pt2 pt3 pt4 pt5 "_C")
     (setvar "FILLETRAD" r)
     (command "_.fillet" pt4 pt5)


 (setvar "SNAPMODE" p_snapmode)
 (setvar "BLIPMODE" p_blipmode)
 (setvar "OSMODE" p_osmode)
)
Что получится?
Хоть и не в AutoCADе проверял, но работает. Fillet действует на последний отрезок, приблизьте участок в координатах (90 , 15). Теперь нужно вычислить точки на двух сопрягаемых линиях примерно в 1 ед. от точки угла. Да и радиус скругления мелковат (может так и должно быть). Кстати, если делать эту фигуру полилинией, можно скруглить сразу все углы.

>> Дима_
А не все ли равно: (setq pt '(0 100)) или (setq pt (list x y)), это одно и тоже. Вот только если XY задаются где-то отдельно, тогда да.

Последний раз редактировалось Олег К., 16.05.2008 в 11:21.
Олег К. вне форума  
 
Непрочитано 16.05.2008, 11:22
#25
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Поняла ты не правильно, с помощью none отключаються привязки, а _fillet'ом надо не точки (как у тебя), а отрезки указывать. Вместо (setq pt '(0 100)) писать (setq pt (list x y)) где х и y предварительно подсчитанные значения координат по соответствующим осям.
P.S. (setq a b) (setq c d) ... можно заменить (setq a b c d), а вообще либо найди книжку по лисп, либо участника форума с твоего города, и всей группой ему на ящик пива сбрасывайтесь.

Кто хоть немного бы разберался в AutoLisp, я никого не знаю в нашем городе - даже знакомых у знакомых нет. Вся надежда только на вашу помошь... Переделала код, как ты посоветовал:
Код:
[Выделить все]
(defun c:auto ()
 (progn
     (setq b (getint "\nВведите длинну: "))
     (setq h (getint "\nВведите ширину: "))
     (setq r 0.50)
     (setq pt1 (list 0 100) pt2 (list 0 125) pt3 (list 40 125) pt4 (list 40 15) pt5 (list 90 15))
     (command "_line" "_none" pt1 "_none" pt2 "_none" pt3 "_none" pt4 "_none" pt5 "_C")
     (setvar "FILLETRAD" r)
     (command "_.fillet" pt4 pt5)
 )
)
Но связка так и не работает. В чём проблемма понять не могу
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 11:27
#26
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


Цитата:
Сообщение от Олег К. Посмотреть сообщение
>> Ju1iya
Если попробовать вот так:
Код:
[Выделить все]
(defun c:auto (/ p_snapmode p_blipmode p_osmode)
 (setq p_snapmode (getvar "SNAPMODE")
       p_blipmode (getvar "BLIPMODE")
       p_osmode (getvar "OSMODE")
 )
 (setvar "SNAPMODE" 0)
 (setvar "BLIPMODE" 0)
 (setvar "OSMODE" 0)


     (setq b (getint "\nВведите длинну: "))
     (setq h (getint "\nВведите ширину: "))
     (setq r 0.50)
     (setq pt1 '(0 100))
     (setq pt2 '(0 125))
     (setq pt3 '(40 125))
     (setq pt4 '(40 15))
     (setq pt5 '(90 15))
     (command "_line" pt1 pt2 pt3 pt4 pt5 "_C")
     (setvar "FILLETRAD" r)
     (command "_.fillet" pt4 pt5)


 (setvar "SNAPMODE" p_snapmode)
 (setvar "BLIPMODE" p_blipmode)
 (setvar "OSMODE" p_osmode)
)
Что получится?
Хоть и не в AutoCADе проверял, но работает. Fillet действует на последний отрезок, приблизьте участок в координатах (90 , 15). Теперь нужно вычислить точки на двух сопрягаемых линиях примерно в 1 ед. от точки угла. Да и радиус скругления мелковат (может так и должно быть). Кстати, если делать эту фигуру полилинией, можно скруглить сразу все углы.

>> Дима_
А не все ли равно: (setq pt '(0 100)) или (setq pt (list x y)), это одно и тоже. Вот только если XY задаются где-то отдельно, тогда да.
Попробвала твой код, но ничего не изменилось, что означают:
(setq p_snapmode (getvar "SNAPMODE")
p_blipmode (getvar "BLIPMODE")
p_osmode (getvar "OSMODE")
и что они задают?
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 13:57
#27
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


>>Олег К. Да, участок в координатах (90 , 15) стал округлым, но надо чтобы был участок между (40 125) и (40 15) - ставлю (command "_.fillet" pt3 pt4) и "_.fillet" уже не срабатывает.
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 14:00
#28
Дима_

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


На приложеном чертеже не нашел 2-х параметров, придумал их сам (см. рисунок), ну и сам код - если не првильный подправлять не буду - сами разирайтесь, не разберетесь пиши поясню.
Код:
[Выделить все]
(defun c:auto ( / n obj obj1 b h pln pln1 spr)
(setvar "filletrad" 5);радиус
(setq
n 0
b (getreal "Введите параметр B ")
h (getreal "Введите параметр H ")
pln (list '(0 0)); начальная точка - pt0
pln (append pln (list (list 0 (* 2.0 b)))); pt1
pln (append pln (list (list (* 4.0 b) (* 2.0 b))));pt2
pln (append pln (list (list (* 4.0 b) (* -8.0 b))));pt3
pln (append pln (list (list (* 7.0 b) (* -8.0 b))));pt4
pln (append pln (list (list (* 7.0 b) (* -5.0 b))));pt5
pln (append pln (list (list (* 12.0 b) (* -5.0 b))));pt6
pln (append pln (list (list (* 12.0 b) (* -8.0 b))));pt7
pln (append pln (list (list (* 9.0 b) (* -8.0 b))));pt8
pln (append pln (list (list (* 9.0 b) (* -6.5 b))));pt9
pln (append pln (list (list (* 8.0 b) (* -6.5 b))));pt10
pln (append pln (list (list (* 8.0 b) (* -9.5 b))));pt11
pln (append pln (list (list (* 3.0 b) (* -9.5 b))));pt12
pln (append pln (list (list (* 3.0 b) (* 0.5 b))));pt13
pln (append pln (list (list b (* 0.5 b))));pt14
pln (append pln (list (list b 0)));pt15

pln1 (list (list (- (* 10.5 b) (* (sqrt 2) (* 0.5 b))) (* -6.5 b))); pt0
pln1 (append pln1 (list (list (* 10.5 b) (+ (* -6.5 b) (* (sqrt 2) (* 0.5 b))))));pt1
pln1 (append pln1 (list (list (+ (* 10.5 b) (* (sqrt 2) (* 0.5 b))) (* -6.5 b))));pt2
pln1 (append pln1 (list (list (* 10.5 b) (- (* -6.5 b) (* (sqrt 2) (* 0.5 b))))));pt3

spr (list
(nth 3 pln)
(nth 4 pln)
(nth 5 pln)
(nth 6 pln)
(nth 7 pln)
(nth 8 pln)
(nth 9 pln)
(nth 10 pln)
(nth 13 pln)
(nth 14 pln)
);сопрягаемые точки

obj (pl pln); создаем большой контур
obj1 (pl pln1); создаем малый
);end of setq

(repeat (length spr) (fil (nth n spr) (/ b 5.0)) (setq n (1+ n))); создает сопряжения.

(command "_region" obj "")
(setq obj (entlast))
(command "_region" obj1 "")
(setq obj1 (entlast)); создает области

(command "_subtract" obj "" obj1 "");вычитает области друг из друга
(command "_extrude" obj "" h); создает 3д тело
);end of auto

(defun fil ( pt x / ); создает сопряжение в точке pt
(command "_fillet"
(list (+ (car pt) x) (cadr pt))
(list (- (car pt) x) (cadr pt)) 
(list (car pt) (+ (cadr pt) x))   
(list (car pt) (- (cadr pt) x))   
);end of command 
);end of fil

(defun pl (obj / ed n tmp); создает полилинию по списку вершин obj.
(setq
ed (list (cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 (length obj))
(cons 70 1));end of list
n 0
tmp (nth n obj)
);end of setq
(while (/= tmp nil)
(setq
ed (append ed (list (append (list 10) (nth n obj))))
n (1+ n)
tmp (nth n obj)
);end setq 
);end of while
(entmakex ed)
);end of defun
P.S. Чтобы увидеть что "оно трехменое" команда 3dorbit.
Миниатюры
Нажмите на изображение для увеличения
Название: auto.jpg
Просмотров: 76
Размер:	13.9 Кб
ID:	6483  
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 16.05.2008 в 14:10.
Дима_ вне форума  
 
Непрочитано 16.05.2008, 14:13
#29
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


>>Дима_
Огромное спасибо за проделаную работу и помошь , ушла переваривать код...
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 14:45
#30
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


>Дима_
Объясни пожалуйста, почему у меня при выполнении твоего кода, не срабатает сопряжение? А пишет:
_fillet
*Неверный выбор*
Требуется точка или Рамка/Последний/Секрамка/БОКС/Линия/РМн-угол/СМн-угол
; ошибка: Функция отменена
И просит выбрать 1-й объект. Мне вроде говорили, что полилинии не сопрягаются - так ли это? А при выполнении 3dorbit фигура всё равно отображается двумерной?
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 14:57
#31
Дима_

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


попробуй при запуске поменять масштаб (колесом мыши впиши квадрат где-то 100 на 100, с учетом параметра b около 10), наверное виной командный режим с которым "_fillet" плохо работает, по хорошему надо сопрягать на dxf уровне, но мне сейчас влом, 3д не показывает поскольку выполнение команды прерываеться, и у тебя остаеться только плоский рисунок. Чтобы убедиться поставь перед строкой
;(repeat (length spr) (fil (nth n spr) (/ b 5.0)) (setq n (1+ n))); создает сопряжения.
создаст, но без сопряжения - но кстати у меня в 2008 все работает.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.05.2008, 15:17
#32
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 310


Ага, вот тут-то мы и узнаем, что автокад русифицированный . Если это вообще AutoCAD.
Возможно после команды _fillet требуется указать рамкой или секрамкой будут выделяться объекты (по коду указывается 2 точки на объект). У меня аналогичная ситуация в ZWCADе - программно 4 точки не понимает, а выбор секрамкой с мышки возможен.

>> Ju1iya
Системные переменные SNAPMODE, BLIPMODE, OSMODE отвечают за ручки выбора и привязки объектов. Подробнее можно посмотреть в хелпе. При работе командными методами желательно устанавливать им значение "0". На этом форуме было несколько тем с подробным объяснением - зачем.
Также команды не всегда могут работать вне видимой части экрана.

Добавлю еще: если точно известны места скругления и радиус, может проще создать полилинию уже со скруглениями, а не мучиться с filletom?
Олег К. вне форума  
 
Непрочитано 16.05.2008, 15:24
#33
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


Цитата:
Сообщение от Дима_ Посмотреть сообщение
попробуй при запуске поменять масштаб (колесом мыши впиши квадрат где-то 100 на 100, с учетом параметра b около 10), наверное виной командный режим с которым "_fillet" плохо работает, по хорошему надо сопрягать на dxf уровне, но мне сейчас влом, 3д не показывает поскольку выполнение команды прерываеться, и у тебя остаеться только плоский рисунок. Чтобы убедиться поставь перед строкой
;(repeat (length spr) (fil (nth n spr) (/ b 5.0)) (setq n (1+ n))); создает сопряжения.
создаст, но без сопряжения - но кстати у меня в 2008 все работает.
Если закоментировать ;(repeat (length spr) (fil (nth n spr) (/ b 5.0)) (setq n (1+ n))); то всё работает, но не сопрягается, а как сделать сопряжение? У меня установлен AutoCad 2006 Rus - при масштабировании ничего не меняется.
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 15:26
#34
Дима_

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


Вобще проще всего наверное сделать автоматическую подгонку масштаба вписать перед сопряжением:
(command "_.zoom" "_o" obj "")
(repeat (length spr) (fil (nth n spr) (/ b 5.0)) (setq n (1+ n))); создает сопряжения.
Ну а правильней всего кочно полилинию с закруглениями сразу создавать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.05.2008, 15:27
#35
Ju1iya

Студентка
 
Регистрация: 15.05.2008
Сообщений: 9


>> Олег К.
Места скругления известны, а радиус на мой выбор, как это реализовать? Да АвтоКад русский.
Ju1iya вне форума  
 
Непрочитано 16.05.2008, 16:01
#36
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 310


>> Ju1iya
Допустим, есть вот такая полилиния:
Код:
[Выделить все]
Command: pl
ENTER to use last point/Follow/<Start of polyline>: 0,0 {pt1}
Current Lineweight: 0.00
Arc/Distance/Follow/Halfwidth/Width/<Next point>: 100,0 {pt2}
Arc/Distance/Follow/Halfwidth/Width/Undo/<Next point>: 100,100 {pt3}
Arc/Close/Distance/Follow/Halfwidth/Width/Undo/<Next point>: 
Command:
Необходимо в угле сделать скругление радиусом 20. Если радиус известен до рисования полилинии, можно сделать следующее:
Код:
[Выделить все]
Command: pl
ENTER to use last point/Follow/<Start of polyline>: 0,0 {pt1}
Current Lineweight: 0.00
Arc/Distance/Follow/Halfwidth/Width/<Next point>: 80,0 {pt2_1}
Arc/Distance/Follow/Halfwidth/Width/Undo/<Next point>: _a
Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Secondpt/Width/Undo/<End of arc>: _r
Radius: 20
Angle/<End of arc>: 100,20 {pt2_2}
Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Secondpt/Width/Undo/<End of arc>: _l
Arc/Close/Distance/Follow/Halfwidth/Width/Undo/<Next point>: 100,100 {pt3}
Arc/Close/Distance/Follow/Halfwidth/Width/Undo/<Next point>: 
Command:
Точки pt2_1 и pt2_2 легко вычисляются математически. Если линии под углом к осям координат - чуть сложнее. Обратите внимание, что следующую точку дуги можно задать не только координатами, но и углом.
Олег К. вне форума  
 
Непрочитано 16.05.2008, 16:18
#37
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 310


Далее.
В программе заданы точки и радиус:
(setq pt1 '(0 0) pt2 '(100 0) pt3 '(100 100) r1 20.0)
Создаем полилинию по этим условиям:
Код:
[Выделить все]
(vl-cmdf "_.pline" pt1 (list (- (car pt2) r1) 0) "_a" "_r" r1 (list 100 (+ (cadr pt2) r1)) "_l" pt3 "")
Функция vl-cmdf аналогична Command, но с некоторыми отличиями. Функции car и cadr - взятие первого и второго элемента списка. Подробнее: в автокаде Tools>Visual Lisp Editor ... Help. (ну это я уже шутю )
Это когда координаты и радиус задаются в процессе выполнения программы. Если известны заранее - нефиг копаться: рисуем руками линии, скругляем где надо, узнаем координаты точек и забиваем их в программу.

По-хорошему, такое надо создавать объектными методами (например через entmake), но это уже следующий уровень обучения.

Последний раз редактировалось Олег К., 16.05.2008 в 16:32.
Олег К. вне форума  
 
Автор темы   Непрочитано 16.05.2008, 19:00
#38
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Когда я сегодня спросил про пример в автокаде про построение садовой дорожки, преподавательница мне ответила, типа пример ужасный и вообще не понимаю зачем столько кода писать когда можно обойтись командами автокада. Ну, а про то что, команды автокада работают медленно и есть другие способы отрисовки моделей мне так и не дали ответа. Теперь от всех скрываю, что задание выполнено, код разбираю.
Вопрос где найти параметры команд типа "_L"
"_g" "_all" ну и тому подобные.

>> Ju1iya на пиво скидываться всей группой не надо, я ещё со своим примером не разобрался.
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Автор темы   Непрочитано 17.05.2008, 20:01
#39
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


что означает эта строка
Код:
[Выделить все]
((lambda (/ res)
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Автор темы   Непрочитано 21.05.2008, 16:37
#40
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


больше всего конечно интересует это
Код:
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
 
Автор темы   Непрочитано 21.05.2008, 18:27
#41
bv7

инженер ОПС
 
Регистрация: 10.05.2008
Березники
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Олег К. Посмотреть сообщение
По-хорошему, такое надо создавать объектными методами (например через entmake), но это уже следующий уровень обучения.
А мне с разборкой кода поможете? А то в некоторых местах я просто не могу понять как оно строится, таких функций нам не давали, в справке по entmakeх и им подобным, мало что написано.
__________________
Жизнь хороша, если правильно подобрать антидепрессанты.
bv7 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > отрисоввка прарметрической 3D модели

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восстановление первоначального вида модели после 3d Orbit в sasha_lif AutoCAD 6 18.06.2008 22:44
AA2008: Как создать план 3d модели на определенной отметке Vildar Вертикальные решения на базе AutoCAD 6 12.02.2008 12:52
Подготовка рабочих чертежей по 3D модели constructorl AutoCAD 21 07.02.2007 19:50
2D чертежи из 3D модели. Как? Karales AutoCAD 1 16.10.2006 18:29
3d модели на плоскости Teplinski AutoCAD 3 26.05.2006 09:29