Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations IDS on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

3D Ramp model - ACAD

Status
Not open for further replies.

Guest
Trying to model a curved disabled access ramp in ACAD....No idea how!! Profile of ramp must remain horizontal while rising..

Any ideas???
 
Replies continue below

Recommended for you

Are you doing this for your benefit or for a project? I work with bridges, large and small; curved and not. We have had good results with 2-D drawings showing plan views and elevations along with all the associated curve dimensions etc.

I know this doesn't help how to draw it in 3-D but I thought I would post anyway to see if this might reduce your burden.
 
Its for a project, Already have all plans and elevations etc but am building model at request of client. Ive done a heck of a lot of modelling ove the past years, but this is the first time that a curved ramp has come up....I have no idea how to do it!! The geometry seems impossible to model on ACAD due to lack of helix support!
 
What do you mean curved
Are you talking about like a spiral staircase or are you talking about a wedge shaped object with a cylinder subtracted from it if everyone helps everybody the world will be a better place
 
Here is a lsp routine that creates helix geometry hope this works for you
Once you have the helix, you should be able to use the 3dpoly as your extrusion path.
;;-----------------------------------------------
;; Programmer's Toolbox #9-97
;; Bill Kramer
;;
;; Draw a Helix type spiral with a 3D polyline.
;;
;;------------------------------------------------------
(if (null (findfile "HELIX.DCL"))
(prompt "\nFile HELIX.DCL must be in search path!"))
;;------------------------------------------------------
;;
;; Listing 1 : Call back function for radio buttons
;;
(defun HELIX_RADIO (key)
(cond
((= Key "CON") ;;constant radius
(setq R2D RAD
RID 0.0)
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
(mode_tile "R2D" 1)
(mode_tile "RID" 1)
)
((= KEY "R2") ;;ending radius
(setq RID (/ (- R2D RAD) REV))
(mode_tile "R2D" 0)
(mode_tile "RID" 1)
(set_tile "RID" (rtos RID))
(mode_tile "R2D" 2)
)
((= Key "RI") ;incremental radius
(setq R2D (+ RAD (* RID REV)))
(mode_tile "R2D" 1)
(mode_tile "RID" 0)
(set_tile "R2D" (rtos R2D))
(mode_tile "RID" 2)
)
)
)
;;-----------------------------------------------
;;
;; Listing 2 - the DCL data file- see HELIX.DCL
;;
;;-----------------------------------------------
;;
;; Listing 3: Call Back function for edit boxes
;;
(defun HELIX_1 (Key Val)
(cond
((and (= Key "RAD") (> (atof Val) 0.0))
(setq RAD (atof Val))
(set_tile "RAD" (rtos RAD))
(if (= (get_tile "CON") "1") (progn
(setq R2D RAD)
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "RI") "1") (progn
(setq R2D (+ RAD (* RID REV)))
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "R2") "1") (progn
(setq RID (/ (- R2D RAD) REV)
)
(set_tile "RID" (rtos RID))
))
)
((= Key "ANG")
(setq ANG (angtof Val))
(set_tile "ANG" (angtos ANG))
)
((= Key "HGT")
(setq HGT (atof Val))
(set_tile "HGT" (rtos HGT))
)
((= Key "R2D")
(setq R2D (atof Val)
RID (/ (- R2D RAD) REV)
)
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
)
((= Key "RID")
(setq RID (atof Val)
R2D (+ RAD (* RID REV))
)
(set_tile "RID" (rtos RID))
(set_tile "R2D" (rtos R2D))
)
((or (= Key "RES") (= Key "RSS"))
(setq RES (atoi Val))
(set_tile "RES" (itoa RES))
(set_tile "RSS" (itoa RES))
)
((= Key "REV")
(setq REV (atof Val))
(set_tile "REV" (rtos REV))
(if (= (get_tile "RI") "1") (progn
(setq R2D (+ RAD (* RID REV)))
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "R2") "1") (progn
(setq RID (/ (- R2D RAD) REV))
(set_tile "RID" (rtos RID))
))
)
)
(HELIX_SEE)
)
;;-----------------------------------------------
;;
;; Listing 4 : Intialize dialog settings
;;
(defun HELIX_INIT ()
(setq RES 25
REV 2.0
HGT 0.25
ANG 0.0
RAD 1.0
RID 0.0
R2D 1.0
)
(set_tile "RES" (itoa RES))
(set_tile "RSS" (itoa RES))
(set_tile "REV" (rtos REV))
(set_tile "HGT" (rtos HGT))
(set_tile "ANG" (angtos ANG))
(set_tile "RAD" (rtos RAD))
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
(set_tile "CON" "1")
)
;;-----------------------------------------------
;; Listing 5 : Load and run dialog box.
;;
(defun HELIX_IN ()
(setq DH (load_dialog "HELIX.DCL"))
(if (or (null DH)
(null (new_dialog "HELIX" DH)))
(alert "File HELIX.DCL missing!")
(progn ;;else file is okay, proceed
(HELIX_INIT)
(HELIX_SEE)
(setq TMP (start_dialog))
(done_dialog DH)
(if (= TMP 1) (progn
(setq CEN
(getpoint
"\nLocate HELIX center point: "))
(if CEN 'T nil)
))
)
)
)
;;-----------------------------------------------
;;
;; Listing 6 - The Helix Generator
;;
(defun C:HELIX (
/
REV ;;number of revolutions
RES ;;resolution/ #of vertices
CEN ;;center point
RAD ;;radius
RID ;;radius increment
R2D ;;ending radius
ANG ;;angle
HGT ;;Z change / revolution
A360 ;; 2 * PI
Z ;;Z value of each point
AI ;;angle increment
ZI ;;Z increment
RI ;;rev counter increment/vertex
RDI ;;radius increment
CX ;;center point X
CY ;;center point Y
R ;;revolutions counter
PP ;;perentage over run at end
)
(if (HELIX_IN) (progn
(setq Z (caddr CEN)
A360 (* 2.0 PI)
AI (/ A360 RES)
ZI (/ HGT RES)
RDI (/ RID RES)
RI (/ 1.0 RES)
R 0.0
CX (car CEN)
CY (cadr CEN)
)
(prompt "\nGenerating helix...")
(entmake '((0 . "POLYLINE")
(10 0.0 0.0 0.0)
(70 . 8)
(8 . "0")
(66 . 1)
))
(while (< R REV)
(setq X (+ CX (* RAD (cos ANG)))
Y (+ CY (* RAD (sin ANG))))
(entmake (list
'(0 . &quot;VERTEX&quot;)
(list 10 X Y Z)
'(8 . &quot;0&quot;)
'(42 . 0.0)
'(70 . 32)
))
(setq ANG (rem (+ ANG AI) A360)
Z (+ Z ZI)
R (+ R RI)
RAD (+ RAD RDI)
)
)
(if (> R REV) (progn
(setq PP (/ (- R REV) RI)
ANG (- ANG (* PP AI))
RAD R2D
Z (- Z (* PP ZI))
)
(entmake (list
'(0 . &quot;VERTEX&quot;)
(list 10 (+ CX (* RAD (cos ANG)))
(+ CY (* RAD (sin ANG)))
Z)
'(8 . &quot;0&quot;)
'(42 . 0.0)
'(70 . 32)
))
))
(entmake '((0 . &quot;SEQEND&quot;)))
))
(princ)
)
;;-----------------------------------------------
;;
;; Listing 7 : View helix in image box
;;
(defun HELIX_SEE (
/
RES ;;resolution, set to 10 for image
ANGL ;;angle
DX ;;DimX multiplier
DY ;;DimY multiplier
DX2 ;;Center of X
DY2 ;;Center of Y
DYS ;;DimY size
SN ;;sine of 30
CS ;;cosine of 30
DD ;;Multiplier
Z ;;Z value
A360 ;;360 degrees in radians
AI ;;Angle increment
ZI ;;Z increment
RDI ;;Radius increment
RI ;;Revolution increment
R ;;Revolution counter
P1X ;;Point 1 X
P1Y ;;Point 1 Y
P2X ;;Point 2 X
P2Y ;;Point 2 Y
RD ;;Radius work value
)
;;
;; determine scale factor to use for world
;; units to image tile coordinates.
;;
(setq DX (dimX_tile &quot;SEE&quot;)
DX2 (fix (/ DX 2.0)) ;;middle of X
DY (dimY_tile &quot;SEE&quot;)
DY2 (fix (/ DY 2.0)) ;;middle of Y
DYS (- DY 10) ;;saved Y size
SN (sin (/ PI 6.0)) ;;30 degree tilt
CS (cos (/ PI 6.0)) ;;30 degree tilt
DX (/ DX ;;ratio of tile to world in X
(+ 1
(* 2.0 (max RAD R2D))) )
DY (/ DY ;;ratio of tile to world in Y
(+ 1
(* CS HGT REV)
(* SN (max RAD R2D))))
DD (min DX DY) ;;use min value
RES 10 ;;tile resolution fixed at 10
Z 0.0 ;;Z offset start at zero
A360 (* 2.0 PI) ;;full circle
AI (/ A360 RES) ;;increments of angle
ZI (/ HGT RES) ;;increments of Z
RDI (/ RID RES) ;;increments of radius
RI (/ 1.0 RES) ;;increments of circle
R 0.0 ;;start of circle
P1X (+ DX2 ;;starting X
(fix (* RAD (cos ANG) DD)))
P1Y (- DYS ;;starting Y
(+ (fix (* SN RAD (sin ANG) DD))
(fix (* CS Z DD))) )
ANGL (+ ANG AI) ;;starting angle
Z (+ Z ZI) ;;starting Z
RD RAD ;;starting radius
)
;;
;; Open image tile and clear it.
;;
(start_image &quot;SEE&quot;)
(fill_image
0 0
(dimX_Tile &quot;SEE&quot;)
(dimY_Tile &quot;SEE&quot;)
0)
;;
;; Output the image tile vectors in loop
;;
(while (< R REV)
(setq P2X (+ DX2 ;;next point X
(fix (* RD (cos ANGL) DD)))
P2Y (- DYS ;;next point Y
(+ (fix (* SN RD (sin ANGL) DD))
(fix (* CS Z DD))))
)
;; shift? then output
(if (or (/= P1X P2X) (/= P1Y P2Y)) (progn
(vector_image P1X P1Y P2X P2Y 2)
(setq P1X P2X
P1Y P2Y)
))
;; next position
(setq ANGL (rem (+ ANGL AI) A360)
Z (+ Z ZI)
R (+ R RI)
RD (+ RD RDI)
)
)
;;
;; do last segment
;;
(if (> R REV) (progn
(setq PP (/ (- R REV) RI)
ANGL (- ANGL (* PP AI))
RD R2D
Z (- Z (* PP ZI))
P2X (+ DX2 (fix (* DD RD (cos ANGL))))
P2Y (- DYS
(+ (fix (* SN DD RD (sin ANGL)))
(fix (* CS Z DD))))
)
(if (or (/= P1X P2X) (/= P1Y P2Y))
(vector_image P1X P1Y P2X P2Y 2)
)
))
;;
;; close image tile and exit function
;;
(end_image)
)
;;-----------------------------------------------
(princ)

 
if you just have Acad 2k up no you cant use the 3d poly as an extrusion path

i made threads for a screw a few years ago and the way i did it was used a torus split it into peices and then 3d rotated them and put it bac together with union if everyone helps everybody the world will be a better place
 
Actually, you are mistaken on this one. I had to give it a try just to find out. I used the helix lisp file to create a 3d poly, then I created a rectangle, did a 3drotate 90, then extruded along the path. It worked great, and all I am using is barebones A2K in Windows 2K. I did make one grievous error. this lisp file requires the help of a DCl file. I grabed this from cadence web site a couple of years ago. I did a search and found the archive again. you can locate it at
 
it might have been cause at the time we were using coplex shapes but thats interesting hmmm
didnt know that learn something new everyday if everyone helps everybody the world will be a better place
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor