Jump to content

Recommended Posts

Posted (edited)

Hello everyone, can you tell me how to get the coordinates of the upper-left point of the trapezoid correctly?

And the angle of 30 degrees does not work...

(defun c:DrawTrapez30 (/ baseHeight height angle radian topBase pt1 pt2 pt3 pt4)
  (setq baseHeight (getreal "\nEnter the size of the bottom base: "))
  (setq height (getreal "\nEnter the height of the trapezoid: "))
  ;; Angle in radians
  (setq angle 30)
  (setq radian (* angle (/ pi 180.0)))
  ;; Calculating the upper base
  (setq topBase (* baseHeight (cos radian)))
  ;; Determining the starting point
  (setq pt1 (getpoint "\nEnter the starting point of the lower base: "))
  ;; Calculating the coordinates of the vertices of a trapezoid???
  (setq pt2 (list (car pt1) (+ (cadr pt1) height))) ; upper left point
  (setq pt3 (list (+ (car pt1) baseHeight) (cadr pt1))) ; lower right point
  (setq pt4 (list (+ (car pt1) baseHeight (* (sin radian) height)) 
                  (+ (cadr pt1) height ))) ; upper right point
  ;; Drawing a trapezoid
  (command "_.pline" pt1 pt2 pt4 pt3 "_C")
(princ))

 

trapezoid30.png

Edited by Nikon
Posted (edited)

Untested, but it should work IMHO...

 

(defun c:DrawTrapez30 (/ baseHeight height ang radian topBase pt1 pt2 pt3 pt4)
  (initget 7)
  (setq baseHeight (getreal "\nEnter the size of the bottom base: "))
  (initget 7)
  (setq height (getreal "\nEnter the height of the trapezoid: "))
  ;; Angle in radians
  (setq ang 30)
  (setq radian (* ang (/ pi 180.0)))
  ;; Determining the starting point
  (setq pt1 (mapcar (function +) (list 0.0 0.0) (getpoint "\nEnter the starting point of the lower base: ")))
  ;; Calculating the coordinates of the vertices of a trapezoid
  (setq pt2 (polar pt1 0.0 baseHeight))
  (setq pt3 (polar pt2 (- (* 0.5 pi) radian) (/ height (cos radian))))
  (setq pt4 (polar pt1 (+ (* 0.5 pi) radian) (/ height (cos radian))))
  ;; Calculating the upper base
  (setq topBase (distance pt3 pt4))
  ;; Drawing a trapezoid
  (command "_.pline" "_non" pt1 "_non" pt2 "_non" pt3 "_non" pt4 "_C")
  (princ)
)

 

Edited by marko_ribar
Changed "angle" variable to "ang" and added "_non" osnaps into "_.pline" command line...
  • Like 1
Posted
1 hour ago, Nikon said:

Hello everyone, can you tell me how to get the coordinates of the upper-left point of the trapezoid correctly?

And the angle of 30 degrees does not work...

(defun c:DrawTrapez30 (/ baseHeight height angle radian topBase pt1 pt2 pt3 pt4)
  (setq baseHeight (getreal "\nEnter the size of the bottom base: "))
  (setq height (getreal "\nEnter the height of the trapezoid: "))
  ;; Angle in radians
  (setq angle 30)
  (setq radian (* angle (/ pi 180.0)))
  ;; Calculating the upper base
  (setq topBase (* baseHeight (cos radian)))
  ;; Determining the starting point
  (setq pt1 (getpoint "\nEnter the starting point of the lower base: "))
  ;; Calculating the coordinates of the vertices of a trapezoid???
  (setq pt2 (list (car pt1) (+ (cadr pt1) height))) ; upper left point
  (setq pt3 (list (+ (car pt1) baseHeight) (cadr pt1))) ; lower right point
  (setq pt4 (list (+ (car pt1) baseHeight (* (sin radian) height)) 
                  (+ (cadr pt1) height ))) ; upper right point
  ;; Drawing a trapezoid
  (command "_.pline" pt1 pt2 pt4 pt3 "_C")
(princ))

 

trapezoid30.png

I think you should rename the variable 'angle': 'angle' is a language symbol, that is, a function.
Try changing it to 'ang', for example.

  • Agree 1
  • Thanks 1
Posted

Here's my quick version:

(defun c:trapezoid (/ bw p0 p1 p2 p3 p4 ra sa th)
   (if
      (and
         (setq bw (getreal "\nEnter the width of the Base: "))
         (setq th (getreal "\nEnter the Height: "))
         (setq sa (getreal "\nEnter the side angles: "))
         (setq p0 (getpoint "\nSelect the insertion point: "))
      )
      (progn
         (setq ra (* pi (/ sa 180.0))
               p1 (list (- (car p0) (/ bw 2)) (cadr p0) (caddr p0))
               p2 (list (+ (car p1) bw) (cadr p0) (caddr p0))
               p3 (list (+ (car p2) (* (/ th (cos ra)) (sin ra))) (+ (cadr p0) th) (caddr p0))
               p4 (list (- (car p1) (* (/ th (cos ra)) (sin ra))) (+ (cadr p0) th) (caddr p0))
         )
         (command-s "._pline" "_non" p1 "_non" p2 "_non" p3 "_non" p4 "_c")
      )
   )
)

 

  • Like 1
  • Agree 1
Posted (edited)
1 hour ago, marko_ribar said:

Untested, but it should work IMHO...

 

(defun c:DrawTrapez30 (/ baseHeight height ang radian topBase pt1 pt2 pt3 pt4)

@marko_ribar thanks, but the code gives an error:
error: invalid argument type: numberp: #<SUBR @000001f24dbceca0 ANGLE>

I replaced it in this line "angle" на "ang" and the code now works.

(setq radian (* angle (/ pi 180.0))) (setq radian (* ang (/ pi 180.0)))

Edited by Nikon
Posted (edited)
58 minutes ago, pkenewell said:

Here's my quick version:

(defun c:trapezoid (/ bw p0 p1 p2 p3 p4 ra sa th)

@pkenewell Thank you, your code works perfectly! And thank you for the possibility of choice the angle.

Edited by Nikon
  • Like 1
Posted

I always try to avoid using command when I can. entmakex is faster and doesn't output to the command line. wrapping with setq you can even save the entity or add to selection set.

 

(setq pts (list p1 p2 p3 p4))
(setq trap
  (entmakex
    (append
      (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1))
      (mapcar '(lambda (p) (cons 10 p)) pts)
    )
  )
)
(sssetfirst nil (ssadd trap))

 

 

  • Like 1
  • Thanks 1
Posted
3 minutes ago, mhupp said:

I always try to avoid using command when I can. entmakex is faster and doesn't output to the command line. wrapping with setq you can even save the entity or add to selection set.

@mhupp thanks, but I don't understand how this can be used in the code...

Posted

Replace (command-s line with what i posted. the (sssetfirst line isn't need just to show as an example.

  • Thanks 1
Posted
1 hour ago, mhupp said:

I always try to avoid using command when I can. entmakex is faster and doesn't output to the command line. wrapping with setq you can even save the entity or add to selection set.

 

(setq pts (list p1 p2 p3 p4))
(setq trap
  (entmakex
    (append
      (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1))
      (mapcar '(lambda (p) (cons 10 p)) pts)
    )
  )
)
(sssetfirst nil (ssadd trap))

 

 

 

and entmake isn't affected by snaps in case you forget to bypass them as necessary. Far better I think - It is all I ever do when creating entities

Posted (edited)
58 minutes ago, mhupp said:

Replace (command-s line with what i posted. the (sssetfirst line isn't need just to show as an example. (command-s line with what i posted. the (sssetfirst line isn't need just to show as an example.

I replaced in the code @pkenewell

(command-s "._pline" "_non" p1 "_non" p2 "_non" p3 "_non" p4 "_c")

with  (entmakex…
It works too.

;; pkenewell  14.11.2025
(defun c:trapezoid-pk-mh (/ bw p0 p1 p2 p3 p4 ra sa th)
   (if
      (and
         (setq bw (getreal "\nEnter the width of the Base: "))
         (setq th (getreal "\nEnter the Height: "))
         (setq sa (getreal "\nEnter the side angles: "))
         (setq p0 (getpoint "\nSelect the insertion point: "))
      )
      (progn
         (setq ra (* pi (/ sa 180.0))
               p1 (list (- (car p0) (/ bw 2)) (cadr p0) (caddr p0))
               p2 (list (+ (car p1) bw) (cadr p0) (caddr p0))
               p3 (list (+ (car p2) (* (/ th (cos ra)) (sin ra))) (+ (cadr p0) th) (caddr p0))
               p4 (list (- (car p1) (* (/ th (cos ra)) (sin ra))) (+ (cadr p0) th) (caddr p0))
         )
; (command-s "._pline" "_non" p1 "_non" p2 "_non" p3 "_non" p4 "_c") ; pkenewell

(setq pts (list p1 p2 p3 p4)) ; mhupp
(setq trap
 (entmakex
 (append
 (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1))
 (mapcar '(lambda (p) (cons 10 p)) pts)
 )
 )
)
      )
   )
 (princ)
)

 

Edited by Nikon

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...