Тема: Как нарисовать пружину (спираль)?

Подскажите пожалуйста как в Autocad 2004 нарисовать пружину (спираль). Честно говоря, я не совсем предсталяю, как это сделать. Но если кто-нибудь сталкивался подскажите.

Re: Как нарисовать пружину (спираль)?

https://www.caduser.ru/forum/search.htm … 0%E0%EB%FC

Re: Как нарисовать пружину (спираль)?

Извините за некорректность. Меня интерессует винтовая линия, объёмная, подобная пружине в аммортизаторах машины. Не расходящаяся, как в 3Dspiral.lsp, а постоянного радиуса.

Re: Как нарисовать пружину (спираль)?

можно половинками тора...это уже обсуждалось...выкручивания на обычной спирали быть не может, поэтому просто половинками, поднимая их на нужный угол...

Re: Как нарисовать пружину (спираль)?

У нас один фанатик написал лисп построения именно такой спирали.
Создается выдавливанием окружности по дугам, на конечных участках дуги в плоскости построения. Объединять солиды приходится вручную, зато строит по 3-4 входящим параметрам.
Если разрешит вышлю лисп.

Re: Как нарисовать пружину (спираль)?

Тут есть необходимые программки с подробным описанием
http://cadburg.by.ru/articles/ac_circramp/ramp-art.htm

Re: Как нарисовать пружину (спираль)?

Вот вам ссылочка народ.
http://www.csf.ru/ftp/cad/lisp/3DSPIRAL.LSP

Re: Как нарисовать пружину (спираль)?

скачав 3dSpiral.lsp, в AutoCAD`e нажимаете:
"Tools > Load Application...", находите тот самый файл и вуаля. готово !
Затем в коммандной строке пишите "3dspiral" или "spiral" в зависимости оттого какая вам нужна спираль на плоскости (2d) или в 3d.

Re: Как нарисовать пружину (спираль)?

...спасибо за ссылку по 3dspiral нужная вещь!!!

Re: Как нарисовать пружину (спираль)?

Всё сделал. Только как строить спираль, там много опций?

Re: Как нарисовать пружину (спираль)?

> essef
Потом она строит линию, а человек спрашивал про SOLID.

Re: Как нарисовать пружину (спираль)?

> Teodor_2000
линия является путём (Path) для Еxtrudа какого либо shape (формы) - это может быть ваш круг, квадрат или любая замкнутая полилиния.

Re: Как нарисовать пружину (спираль)?

Посмотри
https://www.caduser.ru/forum/topic18606.html
Я построил SPRING.dwg , изьползуя программы 3DSPIRAL.lsp и m2s.lsp.[rus] Obe programmy mozhno najti v setke no ja i mogu poslat' ikh.
S privetom
[/rus]Jochen

Re: Как нарисовать пружину (спираль)?

> scj
К сожалению там файл удален... (
а m2s.lsp ? это что ? тоже спираль ?

Re: Как нарисовать пружину (спираль)?

> Esseff
Набери в строке поиска в Goggle: m2s.lsp
Этот файл преобразует поверхность в solid ,правда мне он для спирального тела не подошел...
~'O'~

Re: Как нарисовать пружину (спираль)?

@Essef и Oleg(jr.)
получили ли Вы мой личный email?
С приветом
Jochen
www.black-cad.de

Re: Как нарисовать пружину (спираль)?

> scj
Спасибо Jochen!
Жаль, нет времени разобраться...
~'O'~

Re: Как нарисовать пружину (спираль)?

> Евгений
Выкладываю все по просьбе Йохена:
;;;   SPIRAL.LSP
;;;   Copyright (C) 1992 by Autodesk, Inc.
;;;
;;;   Permission to use, copy, modify, and distribute this software
;;;   for any purpose and without fee is hereby granted, provided
;;;   that the above copyright notice appears in all copies and that
;;;   both that copyright notice and this permission notice appear in
;;;   all supporting documentation.
;;;
;;;   THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
;;;   WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
;;;   PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.
;;; --------------------------------------------------------------------------;
;;; DESCRIPTION
;;;
;;;   This is a programming example.
;;;
;;;   Designed and implemented by Kelvin R. Throop in January 1985
;;;
;;;   This program constructs a spiral. It can be loaded and called
;;;   by typing either "spiral", "3dspiral" or the following:
;;;   (cspiral <# rotations> <base point> <horiz growth per rotation>
;;;            <points per circle> <start radius>
;;;            <vert growth per rotation>).
;;;
;;; --------------------------------------------------------------------------;
(defun myerror (s)                    ; If an error (such as CTRL-C) occurs
                                      ; while this command is active...
  (if (/= s "Function cancelled")
    (princ (strcat "\nError: " s))
  )
  (setvar "cmdecho" ocmd)             ; Restore saved modes
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; Restore old *error* handler
  (princ)
)
(defun cspiral (ntimes bpoint hfac lppass strad vfac
                / ang dist tp ainc dhinc dvinc circle dv)
  (setvar "blipmode" 0)               ; turn blipmode off
  (setvar "cmdecho" 0)                ; turn cmdecho off
  (setq circle (* 3.141596235 2))
  (setq ainc (/ circle lppass))
  (setq dhinc (/ hfac lppass))
  (if vfac (setq dvinc (/ vfac lppass)))
  (setq ang 0.0)
  (if vfac
    (setq dist strad dv 0.0)
    (setq dist 0.0)
  )
  (if vfac
    (command "3dpoly")                ; start spiral ...
    (command "pline" bpoint)          ; start spiral from base point and...
  )
  (repeat ntimes
    (repeat lppass
      (setq tp (polar bpoint (setq ang (+ ang ainc))
                      (setq dist (+ dist dhinc))
               )
      )
      (if vfac
          (setq tp (list (car tp) (cadr tp) (+ dv (caddr tp)))
                dv (+ dv dvinc)
          )
      )
      (command tp)                    ; continue to the next point...
    )
  )
  (command "")                        ; until done.
  (princ)
)
;;;
;;;       Interactive spiral generation
;;;
(defun C:SPIRAL (/ olderr ocmd oblp nt bp cf lp)
  (setq olderr  *error*
        *error* myerror)
  (setq ocmd (getvar "cmdecho"))
  (setq oblp (getvar "blipmode"))
  (setvar "cmdecho" 0)
  (initget 1)                         ; bp must not be null
  (setq bp (getpoint "\nCenter point: "))
  (initget 7)                         ; nt must not be zero, neg, or null
  (setq nt (getint "\nNumber of rotations: "))
  (initget 3)                         ; cf must not be zero, or null
  (setq cf (getdist "\nGrowth per rotation: "))
  (initget 6)                         ; lp must not be zero or neg
  (setq lp (getint "\nPoints per rotation <30>: "))
  (cond ((null lp) (setq lp 30)))
  (cspiral nt bp cf lp nil nil)
  (setvar "cmdecho" ocmd)
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; Restore old *error* handler
  (princ)
)
;;;
;;;       Interactive spiral generation
;;;
(defun C:3DSPIRAL (/ olderr ocmd oblp nt bp hg vg sr lp)
  (setq olderr  *error*
        *error* myerror)
  (setq ocmd (getvar "cmdecho"))
  (setq oblp (getvar "blipmode"))
  (setvar "cmdecho" 0)
  (initget 1)                         ; bp must not be null
  (setq bp (getpoint "\nCenter point: "))
  (initget 7)                         ; nt must not be zero, neg, or null
  (setq nt (getint "\nNumber of rotations: "))
  (initget 7)                         ; sr must not be zero, neg, or null
  (setq sr (getdist bp "\nStarting radius: "))
  (initget 1)                         ; cf must not be zero, or null
  (setq hg (getdist "\nHorizontal growth per rotation: "))
  (initget 3)                         ; cf must not be zero, or null
  (setq vg (getdist "\nVertical growth per rotation: "))
  (initget 6)                         ; lp must not be zero or neg
  (setq lp (getint "\nPoints per rotation <30>: "))
  (cond ((null lp) (setq lp 30)))
  (cspiral nt bp hg lp sr vg)
  (setvar "cmdecho" ocmd)
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; Restore old *error* handler
  (princ)
)
;;; --------------------------------------------------------------------------;
(princ "\n\tC:SPIRAL and C:3DSPIRAL loaded. ")
(princ)

Re: Как нарисовать пружину (спираль)?

> Евгений
Знаменитая на весь мир M2S.LSP
;;    M2S  (Mesh-to-Solid)
;;    Creates an ACIS solid from an open 3d polygon mesh.
;;
;;    Take 2b - Updated 5/24/1999
;;       - Works with REVSURF'd meshes that touch or cross axis of revolution.
;;       - Works even if solid being constructed is not fully visible on screen.
;;       - Works with all open meshes created with REVSURF, RULESURF,
;;          EDGESURF, TABSURF, AI_MESH, and 3DMESH. Most of the stock 3D
;;          surfaces will work if you use DDMODIFY to open them in the M
;;          and N directions.
;;       - Does not work with polyface entities.
;;       - _. prefix added to commands for compatibility with CSG editor and
;;         international users
;;
;;    (c) Copyright 1998,1999 by Bill Gilliss.
;;    All rights reserved... such as they are.
;;
;;    bill.gilliss@aya.yale.edu    gilliss@iglou.com
;;
;;       I wrote this to create sculptable ACIS terrain models
;;    for architectural site renderings. It could also be used
;;    to create thin shells from meshes, by subtracting a moved
;;    copy of the solid from the original solid, but Acad2000 now
;;    does a much better job of this.
;;
;;       The solid is created by projecting each mesh facet "down"
;;    the *current* z-axis to a plane a user-specified distance below
;;    the lowest vertex. To assure that all parts of the mesh are
;;    generated as solids, this distance can not be zero, but the
;;    solid can be SLICEd later if need be.
;;
;;       The solid will match the displayed mesh: if the mesh has
;;    been smoothed and SPLFRAME is set to 0, the solid will be
;;    smoothed. Otherwise, it will not be. The mesh itself is not
;;    changed at all.
;;
(defun c:m2s (/  ent ename entlst M N MN SN SM ST smooth oldecho vtx d1
                 low vtxcnt vtxmax bot bottom p1 p2 p3 p4 c1 c2 c3 c4
                 b1 b2 b3 b4 soldepth ssall ssrow)
(setq oldecho (getvar "cmdecho"))
(setq oldsnap (getvar "osmode"))
(setq oldblip (getvar "blipmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setvar "blipmode" 0)
(command "_.undo" "begin")
;;select the mesh
  (setq ent (entsel "Select a polygon mesh to solidify: "))
  (setq ename (car ent))
  (setq entlst (entget ename))
  (if (not (= (cdr (assoc 0 entlst)) "POLYLINE"))
    (progn
      (alert "That is not a polygon mesh.")
      (exit)
      (princ)
    );progn
  );endif
  (if
    (not
      (or
       (= (cdr (assoc 70 entlst)) 16) ;open 3d polygon mesh
       (= (cdr (assoc 70 entlst)) 20) ;open mesh w/ spline-fit vertices
        );or
       );not
     (progn
       (alert "That is not an *open* polygon mesh.")
       (exit)
       (princ)
     );progn
  );endif
;; decide whether to use smoothed or unsmoothed vertices
  (setq M (cdr (assoc 71 entlst)))   ;M vertices
  (setq N (cdr (assoc 72 entlst)))   ;N vertices
  (setq SM (cdr (assoc 73 entlst)))  ;smoothed M vertices
  (setq SN (cdr (assoc 74 entlst)))  ;smoothed N vertices
  (setq ST (cdr (assoc 75 entlst)))  ;surface type
  (if
    (or
      (= (getvar "splframe") 1)      ;use MxN vertices when splframe = 1
      (= ST 0)                       ;or mesh has not been smoothed
      )
    (setq smooth 0
         MN (* M N))
    (setq smooth 1                   ;use SMxSN vertices when mesh is smoothed
          MN (* SM SN)               ;and SPLFRAME = 0
          M SM
          N SN)
    );if
;; determine lowest vertex
  (grtext -2 "Checking out the mesh...")
  (setq vtx ename)
  (setq vtx (entnext vtx))
  (setq d1 (entget vtx))
  (setq bottom (caddr (trans (cdr (assoc 10 d1)) 0 1)))
  (repeat (1- MN)   ;compare with each vertex's z coord
    (setq vtx (entnext vtx))
    (setq d1 (entget vtx))
    (setq low (caddr (trans (cdr (assoc 10 d1)) 0 1)))
    (setq bottom (min bottom low))
    );repeat
;; get desired thickness of solid
  (setq soldepth 0)
  (while
     (zerop soldepth)
     (progn
       (setq soldepth
          (getdist "\nEnter desired thickness of solid below lowest vertex <1>: "))
       (if (not soldepth) (setq soldepth 1.0))
       (if (zerop soldepth)
          (princ "\nThickness can be small, but not zero. (Slice it later, if need be.)"))
        );progn
     );while
  (setq bot (- bottom (abs soldepth)))
  (setq p1 ename)
  (if (= smooth 1)
      (setq p1 (entnext p1))) ;skip 1st vtx of smoothed mesh - not true vtx
  (setq ssrow (ssadd))        ;initialize set of extruded segments to be unioned as a row
  (setq ssall (ssadd))        ;initialize set of rows to be unioned into the whole
  (grtext -2 "Creating row...")
  (setq vtxmax (- MN N))
  (setq vtxcnt 1)
;;create row of solid segments
  (while (< vtxcnt vtxmax)
    (if (= 0 (rem vtxcnt N))  ;at end of each row...
        (progn
          (setq rowmsg (strcat "Unioning row "
                       (itoa (/ vtxcnt N)) " of "
                       (itoa (1- M)) "... "))
          (grtext -2 rowmsg)
          (command "_.union" ssrow "")
          (setq row (entlast))
          (ssadd row ssall)
          (setq ssrow (ssadd))
          (setq p1 (entnext p1)         ;skip to the next vertex
                vtxcnt (1+ vtxcnt))
          );progn
        );if
    (grtext -2 "Creating row...")
    (setq p1 (entnext p1)                  ;first vertex of mesh square
          p2 (entnext p1)                  ;second vertex
          p3 p2)
    (repeat (1- n) (setq p3 (entnext p3))) ;walk along to 3rd (p1 + N) vertex
    (setq p4 (entnext p3))                 ;4th vertex of mesh square
    (setq c1 (trans (cdr (assoc 10 (entget p1))) 0 1) ;top coordinates
          c2 (trans (cdr (assoc 10 (entget p2))) 0 1)
          c3 (trans (cdr (assoc 10 (entget p3))) 0 1)
          c4 (trans (cdr (assoc 10 (entget p4))) 0 1)
          b1 (list (car c1) (cadr c1) bot)            ;bottom coordinates
          b2 (list (car c2) (cadr c2) bot)
          b3 (list (car c3) (cadr c3) bot)
          b4 (list (car c4) (cadr c4) bot))
          (LOFT c1 c2 c3 b1 b2 b3)
          (LOFT c2 c3 c4 b2 b3 b4)
    (setq vtxcnt (1+ vtxcnt))
  );while
(grtext -2 "Unioning last row...")
  (command "_.union" ssrow "")
  (setq row (entlast))
  (ssadd row ssall)
  (if (> M 2)       ;bypass final union for N x 1 meshes (i.e., RULESURF)
    (progn
      (grtext -2 "Unioning all rows...")
       (command "_.union" ssall "")
        );progn
     );if
;;cleanup
  (command "_.undo" "end")
  (setvar "cmdecho" oldecho)
  (setvar "osmode" oldsnap)
  (setvar "blipmode" oldblip)
  (setq ssall nil ssrow nil)
  (princ)
);defun
;;============== SUBROUTINES ====================
(defun LOFT (r1 r2 r3 s1 s2 s3 / e1 extr highest)
  (command "_.area" s1 s2 s3 "")
  (if (not (equal (getvar "area") 0.0 0.00000001))
    (progn
      (command "_.pline" s1 s2 s3 "_c")
      (setq highest (max (caddr r1) (caddr r2) (caddr r3)))
      (setq extr (- highest bot))
      (command "_.extrude" (entlast) "" extr 0.0)
      (command "_.slice" (entlast) "" "_3points" r1 r2 r3 s1)
      (setq e1 (entlast))
      (ssadd e1 ssrow)
      );progn
    );if
  );defun
(princ "M2S loaded.")
______________________________________________
Привожу почти дословно
(вот бы мне так хорошо знать немецкий)
Руководство для конструирования пружины прямоугольного сечения.
Сначала надо использовать программу 3DSPIRAL.LSP, чтобы создать 2 3Д-спирали,
имеющие одинаковые центры, одинаковые высоты но разные диаметры (начальный угол 0?, конечный угол 360?).
Потом дайте системной переменной SURFTAB1 новую величину, например 100 (по стандарту было 6).
С помощью комманды _RULESURF можно рисовать верхнюю поверхность пружины.
(Для этого надо с мышкой показать на соотвествующие конечные части этих двух спиралей.)
Теперь загружаем и запускаем программу M2S.LSP.
Надо указать поверхность и задать величину для толщины витка (глубина h значит, что тело распространяется до z-уровня = (самая низкая точка спирали - h).
Потом скопировать это тело и передвинуть дубликат немножко вниз.
Последний шаг: результат вычитания этих двух тел.
Надеюсь, что всё было понятно.
Много успехов!
Jochen
www.black-cad.de

Re: Как нарисовать пружину (спираль)?

> Евгений
А это вариант пружины постоянного диаметра, правда не очень гладкой,
если устроит, переделай для интерактивного ввода парметров самммммммм
(defun C:SPE (/ *error      *error*     acapp adoc  an    ang   h
          ht    hz      l    mdsp  n        ocmd  older    oosm  p0
          pts1  pts2  rad    s1    s2    s3      s4    s5    s6
          s7    solid ss    ss2   surf1 surf2 tmp1    tmp2  ts
          vs
         )
  (vl-load-com)
  (setq ocmd (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq oosm (getvar "osmode"))
  (setvar "osmode" 0)
  (setq surf1 (getvar "surftab1"))
  (setvar "surftab1" 64)
  (setq surf2 (getvar "surftab2"))
  (setvar "surftab2" 64)
  (or acapp (setq acapp (vlax-get-acad-object)))
  (or adoc (setq adoc (vla-get-activedocument acapp)))
  (or mdsp (setq mdsp (vla-get-modelspace adoc)))
  (defun *error    (msg)
    (vla-endundomark adoc)
    (command "_.U")
    (princ "\nОтмена рисования спирали\n")
    (princ)
  )
  (alert "\nДлительное выполнение")
  (vla-startundomark adoc)
  (setq    older    *error*
    *error*    *error
  )
  (vl-cmdf "plan" "w")
  (setq    l   120.                  ;высота пружины
    rad 100.                  ;внутренний диаметр пружины
    h   40.                      ; шаг пружины
    vs  10.                      ;ширина витка
    ts  5.                      ; толщина витка
    n   32                      ; число сегментов на виток
    hz  (/ h n)                  ; приращение по высоте на один сегмент
    p0  '(0. 0. 0.)
    ang (* (/ pi n) 2)
    an  0
  )
  (setq    an 0
    ht 0.
  )
  (repeat (fix (/ l h))
    (repeat (1+ n)
      (setq tmp1 (polar p0 an rad))
      (setq pts1 (cons (list (car tmp1) (cadr tmp1) ht) pts1))
      (setq ht (+ ht hz))
      (setq an (+ an ang))
    )
  )
  (setq    an  0
    ht  0.
    rad (+ vs rad)
  )
  (repeat (fix (/ l h))
    (repeat (1+ n)
      (setq tmp2 (polar p0 an rad))
      (setq pts2 (cons (list (car tmp2) (cadr tmp2) ht) pts2))
      (setq ht (+ ht hz))
      (setq an (+ an ang))
    )
  )
  (setq    pts1 (reverse pts1)
    pts2 (reverse pts2)
  )
  (setq    ss  (ssadd)
    ss2 (ssadd)
  )
  (while (caddr pts1)
    (setq ss (ssadd))
    (command "line" (car pts1) (car pts2) "")
    (ssadd (entlast) ss)
    (command "line" (caddr pts1) (caddr pts2) "")
    (ssadd (entlast) ss)
    (command "arc" (car pts1) (cadr pts1) (caddr pts1))
    (ssadd (entlast) ss)
    (command "arc" (car pts2) (cadr pts2) (caddr pts2))
    (ssadd (entlast) ss)
    (command "pedit" "m" ss "" "y" "j" "" "")
    (command "extrude" (entlast) "" (* ts 4) "")
    (setq solid (entlast))
    (setvar "osmode" 0)
    (command "osnap" "non")
    (setq
      s1 (car pts2)
      s2 (caddr pts2)
      s3 (inters (cadr pts2) (cadr pts1) (list 0. 0. l) p0 nil)
      s4 (list (car s1) (cadr s1) (+ (caddr s1) ts))
      s5 (list (car s2) (cadr s2) (+ (caddr s2) ts))
      s6 (list (car s3) (cadr s3) (+ (caddr s3) ts))
      s7 (list (car s1) (cadr s1) (+ (caddr s1) (* ts 3)))
    )
    (command "slice" solid "" "" s1 s2 s3 s7)
    (command "slice" solid "" "" s4 s5 s6 s1)
    (ssadd (entlast) ss2)
    (setq pts1 (cddr pts1)
      pts2 (cddr pts2)
    )
    (setq ss nil)
  )
  (command "union" ss2 "")
  (vl-cmdf "-view" "swiso")
  (vla-zoomextents (vla-get-application adoc))
  (vla-regen adoc acactiveviewport)
  (setvar "surftab1" surf1)
  (setvar "surftab2" surf2)
  (setvar "osmode" oosm)
  (setvar "cmdecho" ocmd)
  (setq    *error*    older
    *error nil
  )
(gc)
  (vla-endundomark adoc)
(princ)
)
;;;  TesT:(C:SPE)
~'O'~

Re: Как нарисовать пружину (спираль)?

[rus]Bol'shoe tebe spasibo, Oleg.
Teper' dazhe ja ponjal, kak ja jeto sdelal wink)
Blagodarju!
[/rus]
Jochen
www.black-cad.de

Re: Как нарисовать пружину (спираль)?

> scj
Спасибо большое тебе, Jochen, скажут еще не раз,
поскольку эта тема одна из самых востребованных
~'O'~