jimpcfd Posted September 9, 2010 Share Posted September 9, 2010 hi, has anyone got a lisp routine to calculate the length of all layers(lines,arcs, circles etc) and then display the result on the command line. ie layer 1 = (what ever) layer 2 = (what ever) layer 3 = (what ever) etc etc. Cheers jimpcfd Quote Link to comment Share on other sites More sharing options...
ReMark Posted September 9, 2010 Share Posted September 9, 2010 That's an unusual request. The length of all layers? What types of drawings do you do? What exactly are you measuring? Quote Link to comment Share on other sites More sharing options...
migs Posted September 9, 2010 Share Posted September 9, 2010 There is a LISP Lee Mac wrote however it displays the results in a table as opposed to on the command line http://www.cadtutor.net/forum/showthread.php?42734-Line-Length-Calculator Quote Link to comment Share on other sites More sharing options...
alanjt Posted September 9, 2010 Share Posted September 9, 2010 Just for fun, here's a quickie... (defun c:LayerLengths (/ data name ss lst) ;; Alan J. Thompson, 09.09.10 (vl-load-com) (while (setq data (tblnext "LAYER" (null data))) (or (wcmatch (setq name (cdr (assoc 2 data))) "*|*") (if (setq ss (ssget "_X" (list '(0 . "ARC,CIRCLE,LINE,*POLYLINE,SPLINE") (cons 8 name)))) ((lambda (i tot / e) (while (setq e (ssname ss (setq i (1+ i)))) (setq tot (+ tot (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))) ) (setq lst (cons (cons name tot) lst)) ) -1 0. ) (setq lst (cons (cons name 0.) lst)) ) ) ) (mapcar (function print) (vl-sort lst (function (lambda (a b) (< (car a) (car b)))))) (princ) ) Quote Link to comment Share on other sites More sharing options...
jimpcfd Posted September 10, 2010 Author Share Posted September 10, 2010 thanks alanjt that's just what i needed. There is a LISP Lee Mac wrote however it displays the results in a table as opposed to on the command line Hi migs i had a look at lee's routine, it does a great job but alanjt routine is perfect for me. thanks jimpcfd Quote Link to comment Share on other sites More sharing options...
alanjt Posted September 10, 2010 Share Posted September 10, 2010 thanks alanjt that's just what i needed. No problem. It was a simple one. Quote Link to comment Share on other sites More sharing options...
VVA Posted September 13, 2010 Share Posted September 13, 2010 my five cents ;Command MLEN4 (defun c:mlen4 (/ m ss clist temp) (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen3_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) ) (vl-load-com) (and (setq m (getreal "\nEnter a scale factor:\t")) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n The total length of all primitives of layers:" ) (mapcar 'mlen3_1 clist) ) (princ) ) ;_ defun Quote Link to comment Share on other sites More sharing options...
VVA Posted September 13, 2010 Share Posted September 13, 2010 and with export to exel ;_Command MLEN41 (defun c:mlen41 (/ m ss clist temp) (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_len m) 2 4)) ) (vl-load-com) (if (null *M*)(setq *M* 1)) (initget 6) (and (princ "\nEnter a scale factor: <") (princ *M*)(princ ">: ") (or (setq m (getreal)) (setq m *M*) ) (setq *M* m) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n The total length of all primitives of layers:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Layer" "Length") nil "mlen41") ) (princ) ) ;_ defun ;|= EN ================= XLS ======================================== * posted by Vladimir Azarko (VVA) * Purpose: Export of the list of data Data-list in Excell * It is exported to a new leaf of the current book. If the book is not present, it is created * Arguments: Data-list - The list of lists of data (LIST) ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Each list of a kind (Value1 Value2... VlalueN) enters the name in a separate line in corresponding columns (Value1-A Value2-B and .т.д.) header - The list (LIST) headings or nil a kind (" Signature A " " Signature B "...) If header nil, is accepted ("X" "Y" "Z") Colhide - The list of alphabetic names of columns to hide or nil - to not hide ("A" "C" "D") - to hide columns A, C, D Name_list - The name of a new leaf of the active book or nil - is not present * Return: nil * Usage (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Col1" "Col2" "Col3" "Col4") '("B") "test") |; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ)) Quote Link to comment Share on other sites More sharing options...
jimpcfd Posted September 13, 2010 Author Share Posted September 13, 2010 hi VVA i don't use Excel, but i like your first one, it would be nice if i could select just the layers that i need to display the lengths of, is that possible? thanks jimpcfd Quote Link to comment Share on other sites More sharing options...
VVA Posted September 13, 2010 Share Posted September 13, 2010 hi VVA i don't use Excel, but i like your first one, it would be nice if i could select just the layers that i need to display the lengths of, is that possible? thanks jimpcfd why not. Try new version mlen4 ;;Command MLEN4 (defun c:mlen4 (/ m ss clist temp lay) (defun mydcl (zagl info-list / fl ret dcl_id msg) (vl-load-com) (if (null zagl) (setq zagl "Select") ) ;_ end if (setq fl (vl-filename-mktemp "mip" nil ".dcl")) (setq ret (open fl "w")) (mapcar '(lambda (x) (write-line x ret)) (list "mip_msg : dialog { " (strcat "label=\"" zagl "\";") " :list_box {" "alignment=top ;" "multiple_select = true ;" "width=31 ;" (if (> (length info-list) 26) "height= 26 ;" (strcat "height= " (itoa (+ 3 (length info-list))) ";") ) ;_ end of if "is_tab_stop = false ;" "key = \"info\";}" "ok_cancel;}" ) ;_ end of list ) ;_ end of mapcar (setq ret (close ret)) (if (and (null (minusp (setq dcl_id (load_dialog fl)))) (new_dialog "mip_msg" dcl_id) ) ;_ end and (progn (start_list "info") (mapcar 'add_list info-list) (end_list) (set_tile "info" "0") (setq ret "0") (action_tile "info" "(setq ret $value)") (action_tile "cancel" "(done_dialog 0)") (action_tile "accept" " (done_dialog 1)") (if (zerop (start_dialog)) (setq ret nil) (setq ret (mapcar (FUNCTION (lambda (num) (nth num info-list))) (read (strcat "(" ret ")")) ) ;_ end mapcar ) ;_ end setq ) ;_ end if (unload_dialog dcl_id) ) ;_ end of progn ) ;_ end of if (vl-file-delete fl) ret ) (defun tablelist (s / d r) (while (setq d (tblnext s (null d))) (setq r (cons (cdr (assoc 2 d)) r)) ) ;while ) ;defun (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen3_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) ) (vl-load-com) (and (setq m (getreal "\nEnter a scale factor:\t")) (setq lay (mydcl "Select Layers" (vl-remove-if-not 'snvalid (ACAD_STRLSORT (tablelist "Layer"))))) (setq lay (apply 'strcat(mapcar (function(lambda(x)(strcat x ","))) lay))) (setq ss (ssget "_X" (list (cons 8 lay)(cons 410 (getvar "CTAB"))))) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n The total length of all primitives of layers:" ) (mapcar 'mlen3_1 clist) ) (princ) ) ;_ defun PS.Use Ctrl or Shift key for select layer's in dialog Quote Link to comment Share on other sites More sharing options...
jimpcfd Posted September 13, 2010 Author Share Posted September 13, 2010 many thanks again VVA. that's fantastic . is it possible to make the scale always 1. jimpcfd. Quote Link to comment Share on other sites More sharing options...
VVA Posted September 13, 2010 Share Posted September 13, 2010 found (setq m (getreal "\nEnter a scale factor:\t")) replace (setq m 1.0) Quote Link to comment Share on other sites More sharing options...
jimpcfd Posted September 13, 2010 Author Share Posted September 13, 2010 FANTASTIC . many thanks jimpcfd Quote Link to comment Share on other sites More sharing options...
danielk Posted June 16, 2014 Share Posted June 16, 2014 and with export to exel ;_Command MLEN41 (defun c:mlen41 (/ m ss clist temp) (defun sort (lst predicate) (mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst predicate)) ) (defun combine (inlist is-greater is-equal / sorted current result) (setq sorted (sort inlist is-greater)) (setq current (list (car sorted))) (foreach item (cdr sorted) (if (apply is-equal (list item (car current))) (setq current (cons item current)) (progn (setq result (cons current result)) (setq current (list item)) ) ) ) (cons current result) ) (defun mlen4_1 (lst / sum_len) (setq sum_len 0) (foreach item (mapcar 'car lst) (setq sum_len (+ sum_len (if (vlax-property-available-p item 'length) (vla-get-length item) (cond ((= (strcase (vla-get-objectname item) t) "acdbarc" ) ;_ = (vla-get-arclength item) ) ((= (strcase (vla-get-objectname item) t) "acbcircle" ) ;_ = (* pi 2.0 (vla-get-radius item)) ) (t 0.0) ) ;_ cond ) ;_ if ) ;_ + ) ) (if (not (zerop sum_len)) (princ (strcat "\n\t" (cdar lst) " = " (rtos (* sum_len m) 2 4)) ) ) (list (cdar lst)(rtos (* sum_len m) 2 4)) ) (vl-load-com) (if (null *M*)(setq *M* 1)) (initget 6) (and (princ "\nEnter a scale factor: <") (princ *M*)(princ ">: ") (or (setq m (getreal)) (setq m *M*) ) (setq *M* m) (setq ss (ssget "_:L")) (setq ss (mapcar (function vlax-ename->vla-object) (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex ss) ) ;_ mapcar ) ;_ vl-remove-if ) ) (mapcar '(lambda (x) (setq temp (cons (cons x (vla-get-Layer x)) temp)) ) ss ) (setq clist (combine temp '(lambda (a b) (> (cdr a) (cdr b)) ) '(lambda (a b) (eq (cdr a) (cdr b)) ) ) ) (princ "\n\n The total length of all primitives of layers:" ) (setq temp (mapcar 'mlen4_1 clist)) (xls temp '("Layer" "Length") nil "mlen41") ) (princ) ) ;_ defun ;|= EN ================= XLS ======================================== * posted by Vladimir Azarko (VVA) * Purpose: Export of the list of data Data-list in Excell * It is exported to a new leaf of the current book. If the book is not present, it is created * Arguments: Data-list - The list of lists of data (LIST) ((Value1 Value2 ... VlalueN)(Value1 Value2 ... VlalueN)...) Each list of a kind (Value1 Value2... VlalueN) enters the name in a separate line in corresponding columns (Value1-A Value2-B and .т.д.) header - The list (LIST) headings or nil a kind (" Signature A " " Signature B "...) If header nil, is accepted ("X" "Y" "Z") Colhide - The list of alphabetic names of columns to hide or nil - to not hide ("A" "C" "D") - to hide columns A, C, D Name_list - The name of a new leaf of the active book or nil - is not present * Return: nil * Usage (xls '((1.1 1.2 1.3 1.4)(2.1 2.2 2.3 2.4)(3.1 3.2 3.3 3.4)) '("Col1" "Col2" "Col3" "Col4") '("B") "test") |; (vl-load-com) (defun xls ( Data-list header Colhide Name_list / *aplexcel* *books-colection* Currsep *excell-cells* *new-book* *sheet#1* *sheet-collection* col iz_listo row cell cols) (defun Letter (N / Res TMP)(setq Res "")(while (> N 0)(setq TMP (rem N 26) TMP (if (zerop TMP)(setq N (1- N) TMP 26) TMP) Res (strcat (chr (+ 64 TMP)) Res) N (/ N 26))) Res) (if (null Name_list)(setq Name_list "")) (setq *AplExcel* (vlax-get-or-create-object "Excel.Application")) (if (setq *New-Book* (vlax-get-property *AplExcel* "ActiveWorkbook")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-invoke-method *Sheet-Collection* "Add")) (setq *Books-Colection* (vlax-get-property *AplExcel* "Workbooks") *New-Book* (vlax-invoke-method *Books-Colection* "Add") *Sheet-Collection* (vlax-get-property *New-Book* "Sheets") *Sheet#1* (vlax-get-property *Sheet-Collection* "Item" 1))) (setq *excell-cells* (vlax-get-property *Sheet#1* "Cells")) (setq Name_list (if (= Name_list "") (vl-filename-base(getvar "DWGNAME")) (strcat (vl-filename-base(getvar "DWGNAME")) "&" Name_list)) col 0 cols nil) (if (> (strlen Name_list) 26) (setq Name_list (strcat (substr Name_list 1 10) "..." (substr Name_list (- (strlen Name_list) 13) 14)))) (vlax-for sh *Sheet-Collection* (setq cols (cons (strcase(vlax-get-property sh 'Name)) cols))) (setq row Name_list) (while (member (strcase row) cols)(setq row (strcat Name_list " (" (itoa(setq col (1+ col)))")"))) (setq Name_list row) (vlax-put-property *Sheet#1* 'Name Name_list) (setq Currsep (vlax-get-property *AplExcel* "UseSystemSeparators")) (vlax-put-property *AplExcel* "UseSystemSeparators" :vlax-false) ;_не использовать системные установки (vlax-put-property *AplExcel* "DecimalSeparator" ".") ;_разделитель дробной и целой части (vlax-put-property *AplExcel* "ThousandsSeparator" " ") ;_разделитель тысячей (vla-put-visible *AplExcel* :vlax-true)(setq row 1 col 1) (if (null header)(setq header '("X" "Y" "Z"))) (repeat (length header)(vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (nth (1- col) header)))(setq col (1+ col)))(setq row 2 col 1) (repeat (length Data-list)(setq iz_listo (car Data-list))(repeat (length iz_listo) (vlax-put-property *excell-cells* "Item" row col (vl-princ-to-string (car iz_listo))) (setq iz_listo (cdr iz_listo) col (1+ col)))(setq Data-list (cdr Data-list))(setq col 1 row (1+ row))) (setq col (1+(length header)) row (1+ row)) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat "A1:" (letter col)(itoa row))))) ;_ end of setq (setq cols (vlax-get-property cell 'Columns)) (vlax-invoke-method cols 'Autofit) (vlax-release-object cols)(vlax-release-object cell) (foreach item ColHide (if (numberp item)(setq item (letter item))) (setq cell (vlax-variant-value (vlax-invoke-method *Sheet#1* "Evaluate" (strcat item "1:" item "1")))) (setq cols (vlax-get-property cell 'Columns)) (vlax-put-property cols 'hidden 1) (vlax-release-object cols)(vlax-release-object cell)) (vlax-put-property *AplExcel* "UseSystemSeparators" Currsep) (mapcar 'vlax-release-object (list *excell-cells* *Sheet#1* *Sheet-Collection* *New-Book* *Books-Colection* *AplExcel*))(setq *AplExcel* nil)(gc)(gc)(princ)) This Lisp Is Awesome. thank you so much! Quote Link to comment Share on other sites More sharing options...
TimAUS Posted September 21, 2020 Share Posted September 21, 2020 This is an impressive LSP file. Thank you heaps for figuring this out for us all. Do you know if it would be possible to add hatch areas to this LSP file? Cheers Tim Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.