gendl issueshttps://gitlab.common-lisp.net/gendl/gendl/-/issues2018-02-21T03:26:53Zhttps://gitlab.common-lisp.net/gendl/gendl/-/issues/69many compiler notes about stack allocation2018-02-21T03:26:53ZDave Coopermany compiler notes about stack allocation*Created by: reiniervandijk*
For constructs like:
```lisp
(with-http-response (req ent)
(with-http-body (req ent)
&body body))
```
or
```lisp
(defun foo ()
(flet (...*Created by: reiniervandijk*
For constructs like:
```lisp
(with-http-response (req ent)
(with-http-body (req ent)
&body body))
```
or
```lisp
(defun foo ()
(flet ((fun (a) (* 2 a)))
(fun)))
```
You get compiler notes like for the latter case:
```lisp
note: Closure (flet fun a) will be stack allocated.
```
These are (in my humble opinion) somewhat annoying, because they show up every time as compilation results. Ignoring them is what I do now, but in principle I would like to view compiler note to understand what's going on, but don't be confronted with notes that are not very interesting... shouldn't the standard compiler settings be changed somewhat to prevent these types of notes from popping up every time?https://gitlab.common-lisp.net/gendl/gendl/-/issues/65viewport scales weird when visualizing point2018-02-21T03:26:53ZDave Cooperviewport scales weird when visualizing point*Created by: reiniervandijk*
Whenever you draw a curve/surface/brep object and subsequently a point close or on that object, the viewport zooms out bigtime. Hard to replicate, but you see it a little bit already with:
```lisp
(defin...*Created by: reiniervandijk*
Whenever you draw a curve/surface/brep object and subsequently a point close or on that object, the viewport zooms out bigtime. Hard to replicate, but you see it a little bit already with:
```lisp
(define-object point-test (base-object)
:objects
((curve :type 'b-spline-curve :pass-down (control-points))
(point :type 'point :center (the curve start)))
:computed-slots
((control-points (list (make-point -10 0 0)
(make-point -12 1.0 0.0)
(make-point -14 0.7 0.0)
(make-point -15 0.0 0.0)
(make-point -14 -0.5 0.0)
(make-point -12 0.3 0.0)
(make-point -10 0 0)))))
```
first visualize curve, then the point. You'll notice a little zoom out. In my case it zooms out 50 times more...
**Imported comments:**
*By genworks on 2015-01-30 00:54:29 UTC*
Open for submissions: $100
First make sure this bug is replicatable.
https://gitlab.common-lisp.net/gendl/gendl/-/issues/57alist2plist2018-02-21T03:26:53ZDave Cooperalist2plist*Created by: reiniervandijk*
gdl:alist2plist function gives error when official alist is provided. "official" according to the definition: an a-list is a list of pairs (conses):
http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153....*Created by: reiniervandijk*
gdl:alist2plist function gives error when official alist is provided. "official" according to the definition: an a-list is a list of pairs (conses):
http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153.html
Looking at the source, gdl:alist2plist can only deal with list pairs, and not dotted pairs, although these are perfectly valid building stones of a alist.
Replicate
```lisp
(gdl:alist2plist '(("foo" . 3) ("bar" . 4)))
```
**Imported comments:**
*By genworks on 2015-01-30 00:38:43 UTC*
Open for submission: $50
*By reiniervandijk on 2015-01-30 11:08:59 UTC*
```lisp
(in-package :gdl-user)
(defun alist2plist (alist)
"Plist. Converts an assoc-list to a plist.
:arguments (alist \"Assoc-List\"). Supports both alists
with list syntax or dotted style notation. Examples:
gdl-user> (alist2plist '((:foo . 1) (:bar . 2)))
(:foo 1 :bar 2)
gdl-user> (alist2plist '((:foo 1) (:bar 2)))
(:foo 1 :bar 2)
"
(when alist
(cons (first (first alist))
(cons
;; test cdr list syntax (1 2)
;; or dotted pair notation (1 . 2)
(let ((token (rest (first alist))))
(if (consp token)
;; list syntax
(first token)
;; dotted pair
token))
;; recurse
(alist2plist (rest alist))))))
```https://gitlab.common-lisp.net/gendl/gendl/-/issues/56Gendl bootstrap process2018-02-21T03:26:53ZDave CooperGendl bootstrap process*Created by: reiniervandijk*
(I guess the main issue here is that Gendl might fail the bootstrap process and doesn't provide any insight into why it failed)
I think I’ve mentioned this before, but I’ve experienced this again with a c...*Created by: reiniervandijk*
(I guess the main issue here is that Gendl might fail the bootstrap process and doesn't provide any insight into why it failed)
I think I’ve mentioned this before, but I’ve experienced this again with a colleague who is following the Gendl practicum. It may happen that the HOME directory is unavailable during start-up. As a result, bootstrapping fails without leaving a note. Can’t Gendl use a fall-back model when the HOME directory is unavailable, either by trying the installation directory (might be better anyway) or asking the user to provide a temporary directory?
Status quo: it’s now impossible to know why Gendl is not completing the bootstrap process. I guess that a first improvement would be to at least provide an error pop-up message and show what went wrong. Then the user at least knows what the problem could’ve been. Second step is to accept the likelihood of the HOME directory not being available and implementing a fall-back model.
**Imported comments:**
*By genworks on 2015-01-30 00:37:55 UTC*
Open for submission: $100
https://gitlab.common-lisp.net/gendl/gendl/-/issues/54Tasty errors on quick-save when given object expression2018-02-21T03:26:53ZDave CooperTasty errors on quick-save when given object expression*Created by: genworks*
When you give an Object Expression (instead of package::class) to browse in Tasty, the automatic quick-save which happens with every Ajax call throws an error:
```
got the error #<some-package::some-type @ #...*Created by: genworks*
When you give an Object Expression (instead of package::class) to browse in Tasty, the automatic quick-save which happens with every Ajax call throws an error:
```
got the error #<some-package::some-type @ #x29012eb2> appears to be a GDL
object from a different object hierarchy from the current
object #<tasty:assembly @ #x2902d21a>. GDL currently does not support
writing out and reading back in GDL objects from
a separate object hierarchy.
```
This error will not happen if you instantiate the object via tasty by specifying a package::class.
But Tasty and/or the quick-save and readable-expression functions have to be fixed so as not to incur this error (it is because the root-object is indeed from a different tree hierarchy when you specify a pre-instantiated object to tasty, so this requires a fundamental re-working of the way the readable-expression works for this case).
In the meantime the following patch will turn this into a Warning instead of an Error:
```common-lisp
(in-package :gwl)
(defun quick-save (self &key (snap-folder (glisp:snap-folder)))
(let ((snap-file
(merge-pathnames
(make-pathname :name (format nil "~a" (the instance-id))
:type "snap") snap-folder)))
(with-error-handling ()
(the (write-snapshot :filename snap-file)))))
```
https://gitlab.common-lisp.net/gendl/gendl/-/issues/49Update! button YADD doesn't respond2018-02-21T03:26:53ZDave CooperUpdate! button YADD doesn't respond*Created by: reiniervandijk*
The update! links on either package or symbol documenting page are not responding. The only Update! link that actually works is the one where all packages are listed.*Created by: reiniervandijk*
The update! links on either package or symbol documenting page are not responding. The only Update! link that actually works is the one where all packages are listed.https://gitlab.common-lisp.net/gendl/gendl/-/issues/48Angular-dimension not showing in Tasty2018-02-21T03:26:53ZDave CooperAngular-dimension not showing in Tasty*Created by: reiniervandijk*
1582p002: angular-dimension instances are not visible in a drawing object when visualized in Tasty (PNG). In an exported PDF instance they do, however, appear.
**Imported comments:**
*By genworks on 2013...*Created by: reiniervandijk*
1582p002: angular-dimension instances are not visible in a drawing object when visualized in Tasty (PNG). In an exported PDF instance they do, however, appear.
**Imported comments:**
*By genworks on 2013-07-01 15:47:14 UTC*
this appears to be a bug with SVG/VML output. PNG output does seem to work
for the angular-dimension-test (see attached). Is there another example
which is failing for PNG?
Assuming this is an SVG/VML bug, the fix will be rolled into the upcoming
fix for Issue #49.
On Mon, Jul 1, 2013 at 9:29 AM, reiniervandijk <notifications@github.com>wrote:
> For 1582p002 angular-dimensions instances are not showing in a drawing
> object when visualized in Tasty (PNG). In an exported PDF instance they do,
> however, appear.
>
> —
> Reply to this email directly or view it on GitHub<https://github.com/genworks/gendl/issues/126>
> .
>
--
My Best,
Dave Cooper, Genworks Support
david.cooper@genworks.com, dave.genworks.com(skype)
USA: 248-327-3253(o), 1-248-330-2979(mobile)
UK: 0191 645 1699
*By reiniervandijk on 2013-07-01 16:14:10 UTC*
No, it's not related to SVG/VML, I clearly stated PNG. I saw this happening with two students. Do not have their example code, will try to trace them down. To be continued.
*By genworks on 2013-07-01 16:37:12 UTC*
Fair enough. There are also possibly unrelated bugs with angular-dimension
for SVG output (visible in the canonical example). These will be tracked
and fixed as part of this same Issue.
On Mon, Jul 1, 2013 at 12:14 PM, reiniervandijk <notifications@github.com>wrote:
> No, it's not related to SVG/VML, I clearly stated PNG. I saw this
> happening with two students. Do not have their example code, will try to
> trace them down. To be continued.
>
> —
> Reply to this email directly or view it on GitHub<https://github.com/genworks/gendl/issues/126#issuecomment-20292275>
> .
>
--
My Best,
Dave Cooper, Genworks Support
david.cooper@genworks.com, dave.genworks.com(skype)
USA: 248-327-3253(o), 1-248-330-2979(mobile)
UK: 0191 645 1699
*By genworks on 2015-01-30 00:10:49 UTC*
Open for submissions: $200-300
Confirm that this issue still exists. Put together validation tests for all the dimensioning primitives.
https://gitlab.common-lisp.net/gendl/gendl/-/issues/47Not evident how to change on-change submit behavior in Tasty2018-02-21T03:26:53ZDave CooperNot evident how to change on-change submit behavior in Tasty*Created by: reiniervandijk*
It is often undesirable to have automatic on-change -> submit behavior for settable slot forms in Tasty. Especially with large amounts of object on the canvas, a user would like to set a batch of inputs befo...*Created by: reiniervandijk*
It is often undesirable to have automatic on-change -> submit behavior for settable slot forms in Tasty. Especially with large amounts of object on the canvas, a user would like to set a batch of inputs before triggering any updates. By default, an HTML event that changes a single form element, will lead to an AJAX request. It is not evident to the user how to change this behavior. I see that as an significant shortcoming of the documentation leading to unnecessary frustration and time spent on waiting for re-visualization.
Moreover, consider that fact that the "working..." status at the bottom of the screen often goes unnoticed to newbies, in which case they happily change many settable form elements sequentially, unaware of triggering many sequential updates and eventually the risk of having a "hanging" Tasty. In the current KBE exams, easily 5-10 minutes of an hour-long session are now spent on struggling with Tasty.
**Imported comments:**
*By genworks on 2015-01-30 00:08:33 UTC*
Open for submissions: $100
https://gitlab.common-lisp.net/gendl/gendl/-/issues/46Instances don't trigger tree updates in Tasty on topology changes2018-02-21T03:26:53ZDave CooperInstances don't trigger tree updates in Tasty on topology changes*Created by: reiniervandijk*
On 1581, consider example
```lisp
(define-object my-sequence (base-object)
:input-slots
((no 2 :settable))
:objects
((boxes :type 'box
:sequence (:size (the no)))))
```
When inst...*Created by: reiniervandijk*
On 1581, consider example
```lisp
(define-object my-sequence (base-object)
:input-slots
((no 2 :settable))
:objects
((boxes :type 'box
:sequence (:size (the no)))))
```
When instantiating this object with Tasty using "Class Package:Type" everything is fine. However, when I go for the object expression option, we have strange behavior.
```lisp
(make-self 'my-sequence)
```
fill out self in Tasty object expression box. Then try to alter the :no input message and (hopefully) replicate that an update in the tree is not happening. ONLY when clicking the update button in the interface or restarting Tasty with the same instance will cause an update. It's also leading to errors: when you decrease the number of sequence elements, non-existing sequence members (old-timers) are still shown and drawing these will give errors (obviously).https://gitlab.common-lisp.net/gendl/gendl/-/issues/40translate macro argument list2018-02-21T03:26:53ZDave Coopertranslate macro argument list*Created by: reiniervandijk*
The translate macro argument list is ambiguous. And as a result, I see a lot of users make the same mistakes time after time.
instead of:
```lisp
(origin &rest offsets)
```
I suggest using something ...*Created by: reiniervandijk*
The translate macro argument list is ambiguous. And as a result, I see a lot of users make the same mistakes time after time.
instead of:
```lisp
(origin &rest offsets)
```
I suggest using something like:
```lisp
(origin direction offset &rest rest)
```
Now, a lot of students don't understand what they are supposed to give in and often end up saying something like:
```lisp
(translate (the center) :front)
```
In such cases they get an error message:
```lisp
`nil' is not of the expected type `number'
[Condition of type type-error]
```
And are lost. Arguably, they should have read the manual a bit closer. However, I believe it is the duty of the software developer to be as unambiguous as possible when setting up a utilities library.
It should also be possible to check for proper input, viz. whether 3, 5 or 7 inputs are given. An even better would probably be to define this as a method for automatic safe-typing.
```lisp
(defmethod safe-translate ((origin vector) (direction symbol) (offset number))
(translate origin direction offset))
```
**Imported comments:**
*By reiniervandijk on 2015-02-01 11:42:55 UTC*
Proposed fix:
```lisp
(in-package :geom-base)
(defmacro translate (origin direction offset &rest more-translations)
"[Macro] 3D Point. Within the context of a GDL object definition (i.e. a <tt>define-object</tt>),
translate <b>origin</b> by <b>offset</b> over <b>direction</b>. More direction-offset combinations
can be specified in <b>more-translations</b>.
:arguments (origin \"3D Point\"
direction \"keyword. A direction keyword can be one of:
<ul><li><tt>:top</tt> (or <tt>:up</tt>)</li>
<li><tt>:bottom</tt> (or <tt>:down</tt>)</li>
<li><tt>:left</tt></li>
<li><tt>:right</tt></li>
<li><tt>:front</tt></li>
<li><tt>:rear</tt> (or <tt>:back</tt>)</li></ul>.\"
offset \"number. Distance to translate along offset.\")
:&rest (offsets \"Plist consisting of direction keywords and numbers.\")"
(if more-translations
;; recurse
`(translate (translate-along-vector ,origin
(the (:face-normal-vector (ecase ,direction
((:up :top) :top)
((:down :bottom) :bottom)
(:left :left)
(:right :right)
(:front :front)
((:rear :back) :rear))))
,offset)
,@more-translations)
;; don't recurse
`(translate-along-vector ,origin
(the (:face-normal-vector (ecase ,direction
((:up :top) :top)
((:down :bottom) :bottom)
(:left :left)
(:right :right)
(:front :front)
((:rear :back) :rear))))
,offset)))
```
*By reiniervandijk on 2015-02-01 11:43:09 UTC*
Unfortunately I can not test the YADD documentation string, because I keep on getting this error:
```lisp
[aserve] 13-aserve-worker: 02/01/15 - 11:40:59 - while processing command "GET /assy/geom-base/function-docs/translate.html HTTP/1.1"
got the error Nothing appears after . in list. [file position = 63]
```
Should I register this as new bug?
*By reiniervandijk on 2015-02-01 11:59:50 UTC*
Some form of testing below. I couldn't easily find a way to hook this test into any already existing test module. I noted the regression framework, but it seems to mainly test if something runs, instead of testing for equality or something (correct me if I'm wrong). Here some sort of test.
```lisp
(in-package :gdl-user)
(define-object translate-sample (base-object)
:computed-slots
((bar (translate (the center) :right 1))
(baz (translate (the bar) :rear 2 :top 3))
;; the following correctly casts a compiler warning, how to test?
;; (qux (translate (the center)))
))
(defun translate-test ()
(let ((obj (make-object 'translate-test)))
(assert (equalp (the-object obj bar) (make-point 1 0 0)))
(assert (equalp (the-object obj baz) (make-point 1 2 3)))
t))
```
*By reiniervandijk on 2015-02-01 12:03:00 UTC*
Final note. If anywhere in legacy code something like
```lisp
(translate a-point)
```
occurs, a compiler error is thrown. I don't know if you believe this would be troublesome. IMO, it is unlikely, and moreover, it's not desired to write code like that and the compiler error is very welcome. After all, what's the use of translating a point without direction or offset...https://gitlab.common-lisp.net/gendl/gendl/-/issues/36Selecting geometry in X3D2018-02-21T03:26:53ZDave CooperSelecting geometry in X3D*Created by: tobievandenberg*
The anchors are not working in X3D, so geometry cannot be selected in that mode and associated onclick functions cannot be used.
It seems to work fine in VRML.
The issue can be seen by viewing robot...*Created by: tobievandenberg*
The anchors are not working in X3D, so geometry cannot be selected in that mode and associated onclick functions cannot be used.
It seems to work fine in VRML.
The issue can be seen by viewing robot:assembly in X3D mode.
**Imported comments:**
*By genworks on 2013-09-06 14:13:16 UTC*
Thank you for the report. We want to stabilize anchors for use in VRML, X3D as well as X3DOM.
Can you indicate what OS, browser, and VRML/X3D plugin you are using?
*By tobievandenberg on 2013-09-09 07:27:14 UTC*
Hi Dave,
It was on windows 7, with firefox using the BS Contact plugin.
Best,
Tobie
From: Dave Cooper [mailto:notifications@github.com]
Sent: vrijdag 6 september 2013 16:13
To: genworks/gendl
Cc: Tobie van den Berg - LR
Subject: Re: [gendl] Selecting geometry in X3D (#138)
Thank you for the report. We want to stabilize anchors for use in VRML, X3D as well as X3DOM.
Can you indicate what OS, browser, and VRML/X3D plugin you are using?
—
Reply to this email directly or view it on GitHub<https://github.com/genworks/gendl/issues/138#issuecomment-23942516>.
*By genworks on 2015-01-29 23:53:51 UTC*
Open for submission: $200-300
Audit and clean up selecting and onclick behavior for X3D and X3DOM output-formats (in theory, these should be identical).
*By reiniervandijk on 2015-02-01 16:31:33 UTC*
The fix below to X3D lens adds onclick behavior to X3DOM output. Nice! It required some cleanup of code and an extra parameters attribute. However, there seems to be a strange bug in X3D mode. Whenever the javascript string to eval contains whitespace or comma's, a javascript error is thrown.
```
Uncaught SyntaxError: Unexpected end of input
```
At this stage I can't get my head around this. Perhaps a BSContact-related thingy? Strange, because the VRML counterpart is quite identical, and does work.
*By reiniervandijk on 2015-02-01 16:32:43 UTC*
The fix for now:
```lisp
(define-lens (x3d base-object)()
:output-functions
(
(cad-output
(&key (header? t))
(when header? (write-the header))
(let ((orientation (the orientation*)))
(let ((rotation (quaternion-to-rotation (matrix-to-quaternion orientation)))
;;(rotation (matrix-to-rotation orientation))
(x (get-x (the center)))
(y (get-y (the center)))
(z (get-z (the center)))
)
(cl-who:with-html-output (*stream* nil :indent nil)
((:|Transform| :|translation| (unless (every #'zerop (list x y z))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
((:|Transform| :|rotation| (when rotation
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x rotation) (get-y rotation) (get-z rotation) (get-w rotation))))
(cond
((or (getf (the display-controls) :billboard)
(getf (the display-controls) :billboard-vector))
(cl-who:htm
((:|Billboard| :|axisOfRotation|
(if (getf (the display-controls) :billboard-vector)
(let ((vector (getf (the display-controls) :billboard-vector)))
(format nil "~a ~a ~a" (get-x vector) (get-y vector) (get-z vector)))
(format nil "0 0 0")))
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor| :|url| (format nil "javascript:event=null;~a" (funcall *onclick-function* self)) ;;event=null;
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(t
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor| :|url| (format nil "javascript:event=null;~a" (funcall *onclick-function* self)) ;;event=null;
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(matrix-to-rotation (matrix:transpose-matrix
(the orientation*)))
#+nil
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix
(the orientation*)))))))
(cl-who:htm
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))
#+nil
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(matrix-to-rotation (matrix:transpose-matrix
(the orientation*)))
#+nil
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix
(the orientation*)))))))
(cl-who:htm
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f, ~3,7f, ~3,7f" x y z)))
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
))))))))
(cad-output-tree
(&key (header? t) (from-root? t))
(when header? (write-the header))
(let ((center (if from-root? (the center) (the local-center*)))
(orientation (if from-root? (the orientation*) (the local-orientation*))))
(let ((rotation (quaternion-to-rotation (matrix-to-quaternion orientation)))
;;(rotation (matrix-to-rotation orientation))
(x (get-x center)) (y (get-y center)) (z (get-z center)))
;;
;; FLAG -- factor out the redundant calls and call directly to
;; cad-output, which will itself call to the shape.
;;
(cl-who:with-html-output (*stream* nil :indent nil)
((:|Transform| :|translation| (unless (every #'zerop (list x y z))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
((:|Transform| :|rotation| (when rotation
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x rotation) (get-y rotation) (get-z rotation) (get-w rotation)))
)
(if (null (the children))
(cond
((or (getf (the display-controls) :billboard)
(getf (the display-controls) :billboard-vector))
(cl-who:htm
((:|Billboard| :|axisOfRotation|
(if (getf (the display-controls) :billboard-vector)
(let ((vector (getf (the display-controls) :billboard-vector)))
(format nil "~a ~a ~a" (get-x vector) (get-y vector) (get-z vector)))
(format nil "0 0 0")))
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor| :|url| (format nil "javascript:event=null;~a" (funcall *onclick-function* self)) ;;event=null;
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(t
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor| :|url| (format nil "javascript:event=null;~a" (funcall *onclick-function* self)) ;;event=null;
:|parameter| "target=_self")
(write-the shape)))
(write-the shape))))
(mapc #'(lambda(child)
(write-the-object child (cad-output-tree :header? nil :from-root? nil))) (the children)))
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix (the orientation*))))
#+nil
(matrix-to-rotation (matrix:transpose-matrix (the orientation*))))))
(cl-who:htm
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))
#+nil
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix (the orientation*))))
#+nil
(matrix-to-rotation (matrix:transpose-matrix (the orientation*))))))
(cl-who:htm
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f, ~3,7f, ~3,7f" x y z)))
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))))))))
))
*By genworks on 2015-02-03 00:09:55 UTC*
Is that apparent Javascript error only affecting X3D in BS Contact, or X3DOM as well?
We received the following support response from BS Contact a while back:
>
> thanks for using BS Contact.
> The Anchor url call is not proper MFString encoded. Please replace the url string with
> the following string:
>
> `'"javascript:alert(\"Hey,Now\");"'`
>
> I hope this solves your question.
>
This was in response to an example we provided which looked like:
>
> `javascript:alert('Hey, Now');"`
>
which had been throwing errors. I'm not sure if this is connected to the bug you are seeing or not, putting it out here just in case.
By the way, are we sure that Is the way to add anchors in X3DOM is in fact the same as X3D?
In X3DOM isn't it possible just to use a standard HTML element and add events to it, for example
`<span onclick=gdlAjax(...)> ... some x3d content... </span>`
*By reiniervandijk on 2015-02-03 10:39:46 UTC*
For X3DOM the proposed fix above works like a charm. Use of proper MFStrings does indeed fix X3D format. See the fix below. However, now X3DOM fails, it complain about a syntax error. While browsing through the DOM tree, I now see ``" "code" "`` instead of ``' "code" '``, hmmm. Concerning your previous remark about ``onclick``: I know this, but it works only for X3DOM-with-browser and not for X3D-with-BSContact (correct me if I'm wrong), what about making a separate lens for X3DOM then? thereby largely re-using X3D code. Note that both fixes collectively propose solutions to X3D and X3DOM, but I need input from you to continue.
*By reiniervandijk on 2015-02-03 10:42:12 UTC*
The fix for X3D:
```lisp
(in-package :geom-base)
(defun %gdlajax-MFString% (str)
"string. Converts gdlajax string to MFString format for X3D output. Example:
gdl-user> (setq str \"gdlajax(null, 'args=XXXX')\")
gdl-user> (%gdlajax-MFString% str)
\"'\"javascript:event=null;gdlAjax(null,\\\\\"args=DQooOmlpZCAiMTMxZDg3YjE3MDAiIDpiYXNoZWUgKDolcnAlIG5pbCkgOmZ1bmN0aW9uIDpwZXJmb3JtLWFjdGlvbiEgOmFyZ3VtZW50cw0KICgoOiVycCUgKDpmb290IDpiYXNlIDpyb2JvdCA6cm9vdC1vYmplY3Qtb2JqZWN0KSkpKQ\\\\\",true);\"'\""
(concatenate 'string "'\"javascript:event=null;" (ppcre:regex-replace-all "'" (remove #\Space str) "\\\"") "\"'"))
(define-lens (x3d base-object)()
:output-functions
(
(cad-output
(&key (header? t))
(when header? (write-the header))
(let ((orientation (the orientation*)))
(let ((rotation (quaternion-to-rotation (matrix-to-quaternion orientation)))
;;(rotation (matrix-to-rotation orientation))
(x (get-x (the center)))
(y (get-y (the center)))
(z (get-z (the center)))
)
(cl-who:with-html-output (*stream* nil :indent nil)
((:|Transform| :|translation| (unless (every #'zerop (list x y z))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
((:|Transform| :|rotation| (when rotation
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x rotation) (get-y rotation) (get-z rotation) (get-w rotation))))
(cond
((or (getf (the display-controls) :billboard)
(getf (the display-controls) :billboard-vector))
(cl-who:htm
((:|Billboard| :|axisOfRotation|
(if (getf (the display-controls) :billboard-vector)
(let ((vector (getf (the display-controls) :billboard-vector)))
(format nil "~a ~a ~a" (get-x vector) (get-y vector) (get-z vector)))
(format nil "0 0 0")))
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor|
;; use cl-who:fmt to force ' ' around string and not standard " "
;; strange: without :|url| nothing will be printed, so leave it.
:|url| (cl-who:fmt " url=~a" (%gdlajax-MFString% (funcall *onclick-function* self)))
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(t
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor|
;; use cl-who:fmt to force ' ' around string and not standard " "
;; strange: without :|url| nothing will be printed, so leave it.
:|url| (cl-who:fmt " url=~a" (%gdlajax-MFString% (funcall *onclick-function* self)))
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(matrix-to-rotation (matrix:transpose-matrix
(the orientation*)))
#+nil
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix
(the orientation*)))))))
(cl-who:htm
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))
)))))
(cad-output-tree
(&key (header? t) (from-root? t))
(when header? (write-the header))
(let ((center (if from-root? (the center) (the local-center*)))
(orientation (if from-root? (the orientation*) (the local-orientation*))))
(let ((rotation (quaternion-to-rotation (matrix-to-quaternion orientation)))
;;(rotation (matrix-to-rotation orientation))
(x (get-x center)) (y (get-y center)) (z (get-z center)))
;;
;; FLAG -- factor out the redundant calls and call directly to
;; cad-output, which will itself call to the shape.
;;
(cl-who:with-html-output (*stream* nil :indent nil)
((:|Transform| :|translation| (unless (every #'zerop (list x y z))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
((:|Transform| :|rotation| (when rotation
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x rotation) (get-y rotation) (get-z rotation) (get-w rotation)))
)
(if (null (the children))
(cond
((or (getf (the display-controls) :billboard)
(getf (the display-controls) :billboard-vector))
(cl-who:htm
((:|Billboard| :|axisOfRotation|
(if (getf (the display-controls) :billboard-vector)
(let ((vector (getf (the display-controls) :billboard-vector)))
(format nil "~a ~a ~a" (get-x vector) (get-y vector) (get-z vector)))
(format nil "0 0 0")))
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor|
;; use cl-who:fmt to force ' ' around string and not standard " "
;; strange: without :|url| nothing will be printed, so leave it.
:|url| (cl-who:fmt " url=~a" (%gdlajax-MFString% (funcall *onclick-function* self)))
:|parameter| "target=_self")
(write-the shape)))
(write-the shape)))))
(t
(if (and (find-package :gwl) (symbol-value (read-safe-string "gwl::*onclick-function*")))
(cl-who:htm
((:|Anchor|
;; use cl-who:fmt to force ' ' around string and not standard " "
;; strange: without :|url| nothing will be printed, so leave it.
:|url| (cl-who:fmt " url=~a" (%gdlajax-MFString% (funcall *onclick-function* self)))
:|parameter| "target=_self")
(write-the shape)))
(write-the shape))))
(mapc #'(lambda(child)
(write-the-object child (cad-output-tree :header? nil :from-root? nil))) (the children)))
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix (the orientation*))))
#+nil
(matrix-to-rotation (matrix:transpose-matrix (the orientation*))))))
(cl-who:htm
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f ~3,7f ~3,7f" x y z)))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))
#+nil
(when (and (typep self 'outline-specialization-mixin)
(not (ignore-errors (typep self (read-from-string "surf:surface"))))
(not (ignore-errors (typep self (read-from-string "surf:curve")))))
(let* ((center (reverse-vector (the center)))
(x (get-x center)) (y (get-y center)) (z (get-z center))
(inverse (when (the orientation*)
(quaternion-to-rotation (matrix-to-quaternion (matrix:transpose-matrix (the orientation*))))
#+nil
(matrix-to-rotation (matrix:transpose-matrix (the orientation*))))))
(cl-who:htm
((:|Transform| :|translation| (when (not (every #'zerop (list x y z)))
(format nil "~3,7f, ~3,7f, ~3,7f" x y z)))
((:|Transform| :|rotation| (when inverse
(format nil "~3,7f ~3,7f ~3,7f ~3,7f"
(get-x inverse) (get-y inverse) (get-z inverse) (get-w inverse))))
(mapc #'(lambda(outline-object)
(write-the-object outline-object (cad-output :header? nil)))
(the outline-leaves))
))
)))))))))
))
```
*By genworks on 2015-03-18 16:23:40 UTC*
Yes, since x3dom and x3d (as benchmarked by BS Contact) seem to diverge on handling Anchors, let's have the lenses emit two different "flavors" of x3d -- one tuned for BS Contact and one tuned for x3dom.
Of course this should be done with minimal duplication of code - just a format-slot should do it, i.e.:
(with-format (x3d *stream* :flavor :x3dom) ... )
or
(with-format (x3d *stream* :flavor :x3d-plugin) ...)
I would lean toward the x3dom version using a standard :onclick DOM node, when the intention is to run a function.
On the other hand, what about the ability to have a graphical element be an actual anchor, in the traditional sense --- that is, pointing to an actual URL? Then we would want something like:
((:a :href ... ) ... )
so, do we need both an onclick-function and an anchor? And I guess without the possibility of having both at the same time...
https://gitlab.common-lisp.net/gendl/gendl/-/issues/34Tasty tree pane horizontal scrolling2018-02-21T03:26:54ZDave CooperTasty tree pane horizontal scrolling*Created by: reiniervandijk*
The tree pane in the Tasty interface is currently not scrollable in horizontal direction. It can happen when you double-click some long text string of a tree node that the focus of the pane moves to the end ...*Created by: reiniervandijk*
The tree pane in the Tasty interface is currently not scrollable in horizontal direction. It can happen when you double-click some long text string of a tree node that the focus of the pane moves to the end of the string. It is then impossible to slide back to the left again, because the current resizer handle does not affect the horizontal position. Only F5 solves the problem.
**Imported comments:**
*By genworks on 2015-01-29 23:50:48 UTC*
Open for submissions: $100
This should be fixable with a CSS update.
https://gitlab.common-lisp.net/gendl/gendl/-/issues/31Move slots to their most appropriate class definition2018-02-21T03:26:54ZDave CooperMove slots to their most appropriate class definition*Created by: reiniervandijk*
It doesn't seem to make a lot of sense to have these two slots in the vanilla-mixin* definition:
```lisp
(%corners% nil)
(%vertex-array% nil)
```
Would've expected those slots in base-object. ...*Created by: reiniervandijk*
It doesn't seem to make a lot of sense to have these two slots in the vanilla-mixin* definition:
```lisp
(%corners% nil)
(%vertex-array% nil)
```
Would've expected those slots in base-object. I think it qualifies as an issue, a logically designed language is imperative. These two slots don't follow that cause.
**Imported comments:**
*By genworks on 2013-10-26 02:49:07 UTC*
These were put there for a reason - they are the minimal placeholders in vanilla-mixin to avoid crashing of tasty if you try to include a non-geometric object in the display-list. But you are right, it's not a clean way to do it. We'll make tasty smarter about what it tries to do with non-geometric objects in display list, and remove these slots from here.
*By reiniervandijk on 2013-11-01 07:34:35 UTC*
I understand the purpose of these slots, but if they are abstract slots and merely templates for subclasses that are supposed to be overridden, consider maybe to use:
```lisp
(%corners% *undefined*)
(%vertex-array% *undefined*)
```
or:
```lisp
(%corners% (error "gendl: not implemented, should be overridden in subclasses.")
(%vertex-array% (error "gendl: not implemented, should be overridden in subclasses.")
```
or add a slot:
```lisp
(%drawable?% nil)
```
That you put to true on subclassing.https://gitlab.common-lisp.net/gendl/gendl/-/issues/29cast compiler warnings please2018-02-21T03:26:54ZDave Coopercast compiler warnings please*Created by: reiniervandijk*
Please, cast warnings or errors if someone writes syntactically incorrect object definitions.
```lisp
(define-object A ()
:computed-slots
((a "foo" "bar")))
```
At this moment, Gendl will ignor...*Created by: reiniervandijk*
Please, cast warnings or errors if someone writes syntactically incorrect object definitions.
```lisp
(define-object A ()
:computed-slots
((a "foo" "bar")))
```
At this moment, Gendl will ignore the :a slot definition and the user (me in this case) gets an error when he tries to reference the slot, which is confusing.
**Imported comments:**
*By genworks on 2015-01-29 23:44:31 UTC*
~~Open for submissions: $100~~
This item should cover as many common cases of malformed define-object content as possible.
*By reiniervandijk on 2015-03-26 00:42:52 UTC*
This issue has a double-dollar tag, but only a $100 bounty is posted here. That would correspond to a single-dollar tag, like for the other bounties. Considering the contribution-effort-reward balance, is this a single or double-dollar bounty? I'm considering making a fix, but that depends on this balance.
*By genworks on 2015-03-27 03:25:34 UTC*
Removed bounty, this is too open-ended. Will be adding more bounties for other issues.
*By reiniervandijk on 2015-03-27 13:19:00 UTC*
Nooooo!!! :( While awaiting you reply, I went ahead by implementing a kick-ass extension to Gendl for syntax-checking, for which I dedicated quite some time now. How unfortunate this is. What made you remove the bounty? I personally think this syntax-checker is extremely important ingredient to any language and the description definitely wasn't too open-ended, on the contrary. Will send you a private e-mail with the implementation.https://gitlab.common-lisp.net/gendl/gendl/-/issues/28Tasty remember inspector state2018-02-21T03:26:54ZDave CooperTasty remember inspector state*Created by: reiniervandijk*
Tasty inspector remembers slot-status, but doesn't remember view status, i.e. once a user expanded a list of (say) points and navigates to another node and finally returns to this node, this viewing state is...*Created by: reiniervandijk*
Tasty inspector remembers slot-status, but doesn't remember view status, i.e. once a user expanded a list of (say) points and navigates to another node and finally returns to this node, this viewing state is not remember and the list will be collapsed again. This is quite annoying if you want to quickly inspect and compare list values while hopping over tree nodes.
**Imported comments:**
*By genworks on 2013-10-22 15:04:38 UTC*
Agreed this needs to be fixed. It will require a bit of additional data structures around the inspector since the inspector is currently a single object which keeps getting bashed when you change object.
https://gitlab.common-lisp.net/gendl/gendl/-/issues/24Tasty tree branch closes on inspect2018-02-21T03:26:54ZDave CooperTasty tree branch closes on inspect*Created by: reiniervandijk*
1585: when one tries to inspect certain nodes in a Tasty tree, every now and then the complete tree branch closes. Then the user has to navigate his way down the tree structure again...*Created by: reiniervandijk*
1585: when one tries to inspect certain nodes in a Tasty tree, every now and then the complete tree branch closes. Then the user has to navigate his way down the tree structure again...https://gitlab.common-lisp.net/gendl/gendl/-/issues/22Complete the "Glime" facility (context-sensitive dynamic help/documentation f...2018-02-21T03:26:54ZDave CooperComplete the "Glime" facility (context-sensitive dynamic help/documentation facility in Slime)*Created by: reiniervandijk*
1585: more of an opinionated issue perhaps, but the mini-buffer in 1585 now shows class signatures during editing of object forms and it shows all potential functions arguments for the "the" macro. This resu...*Created by: reiniervandijk*
1585: more of an opinionated issue perhaps, but the mini-buffer in 1585 now shows class signatures during editing of object forms and it shows all potential functions arguments for the "the" macro. This results in a mini-buffer that regularly changes size and takes quite a lot of space (multiple lines). It understand it is the intention of the mini-buffer to provide some hints to the user, but it should not distract, I guess.
**Imported comments:**
*By genworks on 2013-10-29 14:13:07 UTC*
This is the new "glime" facility and is still somewhat experimental.
It can be suppressed by commenting out the compile and loading of
"glime.lisp" in gdl/emacs/gdl.el. In this regard we should update the
startup function in this gdl.el so it can be customized in the user's
personal .emacs-glime in the home directory.
We have put considerable effort into developing this first version of
glime, so other feedback is very welcome.
On Tue, Oct 29, 2013 at 9:53 AM, Reinier van Dijk
<notifications@github.com>wrote:
> 1585: more of an opinionated issue perhaps, but the mini-buffer in 1585
> now shows class signatures during editing of object forms and it shows all
> potential functions arguments for the "the" macro. This results in a
> mini-buffer that regularly changes size and takes quite a lot of space
> (multiple lines). It understand it is the intention of the mini-buffer to
> provide some hints to the user, but it should not distract, I guess.
>
> —
> Reply to this email directly or view it on GitHub<https://github.com/genworks/gendl/issues/152>
> .
>
--
My Best,
Dave Cooper, Genworks Support
david.cooper@genworks.com, dave.genworks.com(skype)
USA: 248-327-3253(o), 1-248-330-2979(mobile)
UK: 0191 645 1699
*By reiniervandijk on 2013-10-29 14:15:47 UTC*
Considering the considerable effort spent, let me start by first saying: great initiative! I think this type of facility is very welcome in Gendl.
*By genworks on 2015-01-29 23:19:45 UTC*
Open for bids: $500-800
Glime has to be finished and polished. The basic functionality is there, so it would take someone with CL and Emacs Lisp skills to read through the implementation, understand enough about Gendl to understand what it is supposed to do, and clean it up.
Please contact Genworks before initiating work on this project, so the detailed scope and requirements can be agreed.
https://gitlab.common-lisp.net/gendl/gendl/-/issues/16define-object-amendment affects source definition locations2018-02-21T03:26:54ZDave Cooperdefine-object-amendment affects source definition locations*Created by: reiniervandijk*
When using define-object-amendment, any use of M-. (find-tag) for that class symbol will jump to the buffer where amendment was made. It is impossible (as far as I know) to retrieve the original definition. ...*Created by: reiniervandijk*
When using define-object-amendment, any use of M-. (find-tag) for that class symbol will jump to the buffer where amendment was made. It is impossible (as far as I know) to retrieve the original definition. Shouldn't M-. point to original definition instead of pointing to an amendment?
**Imported comments:**
*By genworks on 2013-12-02 21:45:31 UTC*
Good point. The define-object-amendment mechanism needs to be hooked into slime-edit-definition. As it is currently the define-object-amendment does a rather brute-force redefinition of the class object.
*By genworks on 2015-01-29 23:11:47 UTC*
Open for submissions: $200~~-300~~. Requires full regression tests in the style of the tests in gendl/regression/source/ and e.g. gendl/regression/geom-base/source/angle-between-vectors.lisp.
~~define-object-amendment also needs to be audited to make sure it is up to date with the latest define-object.~~
*By genworks on 2015-01-30 22:29:57 UTC*
Merging #167 into here:
Macro ``define-object-amendment`` does not check for override of reserved words. Hence, a user can naively break gendl completely by doing something like.
```lisp
(define-object foo ())
```
And then:
```lisp
(define-object-amendment foo ()
:computed-slots
((parent nil)))
```
*By reiniervandijk on 2015-03-25 17:33:02 UTC*
Some questions:
1. I have made a fix for this assuming you wanted to maintain the brute-force redefinition approach. Is this presumption okay? Or do you fundamentally want to change the amendment implementation? At this stage I had to add a slot to the metaclass (to keep a pointer to the original class which is redefined) and make some extensions to the swank-backend. This works now.
2. Do you prefer M-. to prompt a list of files, one for the base definition and one for each amendment. Or do you only want it to work with the original class definition only? In the latter case, M-. immediately takes the user to the definition in the corresponding file. Otherwise, a new menu prompts the user to choose which file to go to. My preference would go to the latter, but both are fine to me, your call.
3. I just notice a new part of the problem assignment: "define-object-amendment also needs to be audited to make sure it is up to date with the latest define-object." This is a rather vague assignment. Actually, so vague, that it's hard to see what more is expected from me here to solve the original source redefinition issue.
4. What do you expect to see at: "Requires full regression tests"? Your tests seem to not actually test for equality or anything or for the fact that some error must be raised, instead, it just checks if the ``regression-test-data`` slot runs without failure. Do you expect me to write some code in this slot that implement a true test, e.g. ``if source-files for new class is not equal to some-known-value then raise``.
If you could provide a short-term answer to the former questions, then I'm ready to upload.
*By reiniervandijk on 2015-03-25 22:42:36 UTC*
Status update:
- source locations maintained for original object and each amendment to it
- reserved word check implemented
- regression-test made (with best assumptions on what you expect to see)
*By genworks on 2015-03-26 19:38:03 UTC*
>
> I have made a fix for this assuming you wanted to maintain the brute-force redefinition approach.
> Is this presumption okay? Or do you fundamentally want to change the amendment implementation?
>
I'm not sure of any other way to do it, without getting into internal (and probably non-portable) CLOS and MOP tricks.
>
> At this stage I had to add a slot to the metaclass (to keep a pointer to the original class which
> is redefined) and make some extensions to the swank-backend. This works now.
>
Do you mean a pointer to the file or to the actual class object itself?
Does this work for the case where multiple define-object-amendments are invoked?
>
> Do you prefer M-. to prompt a list of files, one for the base definition and one for each amendment.
> Or do you only want it to work with the original class definition only?
>
I would think it should present a list of all locations of definitions - similar to what you get for a defmethod which has several implementations for different argument signatures.
>
> I just notice a new part of the problem assignment: "define-object-amendment also needs
> to be audited to make sure it is up to date with the latest define-object." This is a rather
> vague assignment. Actually, so vague, that it's hard to see what more is expected from
> me here to solve the original source redefinition issue.
>
Please forget that part of the assignment, and we'll stick to the low end of the price range.
>
> What do you expect to see at: "Requires full regression tests"? Your tests seem to not actually
> test for equality or anything or for the fact that some error must be raised, instead, it just checks
> if the regression-test-data slot runs without failure.
>
The generic "Lift" framework that we have in place already has utilities for seeding the regression-test-data, then running future tests to compare the regression-test-data with the previously seeded data. That part's not necessary to write for each individual test. So all that is necessary is to have test(s) which compute some useful regression-test-data.
*By genworks on 2015-03-27 03:49:12 UTC*
Actually for this item I'm not sure how the regression-test-data approach would work. This one might need a manual test procedure. Actually two items here - the M-. and the reserved-word check for define-object-amendment.
*By reiniervandijk on 2015-03-27 13:30:39 UTC*
Fix has been sent to you in a private message. Let me know if you have questions. Note that the test is automated, no need for a manual procedure. Note new test utilities that check for failure or absence of it. These are proposed as necessary add-ons to the lift framework and they allow for true automated testing.
> Do you mean a pointer to the file or to the actual class object itself?
Pointer to the file(s)
> Does this work for the case where multiple define-object-amendments are invoked?
yes
> I would think it should present a list of all locations of definitions - similar to what you get for a defmethod which has several implementations for different argument signatures.
That's how it works.
> Please forget that part of the assignment, and we'll stick to the low end of the price range.
Well, I've re-audited it for the extent of checking for reserved-symbol-overrides. Please, don't suddenly change the conditions for the bounty while someone is working on it.https://gitlab.common-lisp.net/gendl/gendl/-/issues/11Inappropriate picture when visualizing one point2018-02-21T03:26:54ZDave CooperInappropriate picture when visualizing one point*Created by: reiniervandijk*
GDL1587p001: Trying to visualize a single point now from the value-inspector using add-node. If that point is the first thing to visualize, no point is displayed. Instead, a pipe-smoking man cartoon pops up....*Created by: reiniervandijk*
GDL1587p001: Trying to visualize a single point now from the value-inspector using add-node. If that point is the first thing to visualize, no point is displayed. Instead, a pipe-smoking man cartoon pops up. I can see that humor of it, but don't see how I can easily visualize my point then...
```
(define-object test (base-object)
:computed-slots
((pt (make-point 1 2 3))))
```
**Imported comments:**
*By genworks on 2015-01-29 21:50:15 UTC*
Open for submissions. $100
Sort this out as well as cleaning up the handling of 3D points (bare vectors of 3 floating-point numbers) vs. GDL points (actual GDL objects, which should be displaying fine).
*By genworks on 2015-01-29 22:11:04 UTC*
Copying from #162:
GDL1587p001: trying visualize in Tasty:
(define-object test (base-object)
:computed-slots
((pts (list (make-point 1 2 3)))))
In inspector, try add-node on a point:
! ERROR: Neither # nor any of its ancestor instances could handle the :parent-node message The path to the containing object is: (the :root :inspector (:values 29) (:sequence-elements 0)) !
https://gitlab.common-lisp.net/gendl/gendl/-/issues/6YADD documentation error2018-02-21T03:26:53ZDave CooperYADD documentation error*Created by: reiniervandijk*
For user-defined functions, objects, etc, that I document and that I want to visualize inside YADD. I get the following error:
```lisp
[aserve] 13-aserve-worker: 02/01/15 - 11:40:59 - while processing ...*Created by: reiniervandijk*
For user-defined functions, objects, etc, that I document and that I want to visualize inside YADD. I get the following error:
```lisp
[aserve] 13-aserve-worker: 02/01/15 - 11:40:59 - while processing command "GET /assy/geom-base/function-docs/translate.html HTTP/1.1"
got the error Nothing appears after . in list. [file position = 63]
```
The example in my case for replication:
```lisp
(in-package :geom-base)
(defmacro translate (origin direction offset &rest more-translations)
"[Macro] 3D Point. Within the context of a GDL object definition (i.e. a <tt>define-object</tt>),
translate <b>origin</b> by <b>offset</b> over <b>direction</b>. More direction-offset combinations
can be specified in <b>more-translations</b>.
:arguments (origin \"3D Point\"
direction \"keyword. A direction keyword can be one of:
<ul><li><tt>:top</tt> (or <tt>:up</tt>)</li>
<li><tt>:bottom</tt> (or <tt>:down</tt>)</li>
<li><tt>:left</tt></li>
<li><tt>:right</tt></li>
<li><tt>:front</tt></li>
<li><tt>:rear</tt> (or <tt>:back</tt>)</li></ul>.\"
offset \"number. Distance to translate along offset.\")
:&rest (offsets \"Plist consisting of direction keywords and numbers.\")"
(if more-translations
;; recurse
`(translate (translate-along-vector ,origin
(the (:face-normal-vector (ecase ,direction
((:up :top) :top)
((:down :bottom) :bottom)
(:left :left)
(:right :right)
(:front :front)
((:rear :back) :rear))))
,offset)
,@more-translations)
;; don't recurse
`(translate-along-vector ,origin
(the (:face-normal-vector (ecase ,direction
((:up :top) :top)
((:down :bottom) :bottom)
(:left :left)
(:right :right)
(:front :front)
((:rear :back) :rear))))
,offset)))
```
Perhaps it's because at the moment of writing I don't have access to my H: directory, which Gendl takes as the HOME directory for placing temporary files or something? If that's the case (I remember something similar with the boostrapping process), perhaps don't make this assumption inside YADD code and write work-arounds?