Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gendl
gendl
Commits
42d3dc8c
Commit
42d3dc8c
authored
Sep 08, 2014
by
Dave Cooper
Browse files
added new iges writer test
parent
5efb5056
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
gwl/source/cookies/answer.lisp
0 → 100755
View file @
42d3dc8c
This diff is collapsed.
Click to expand it.
gwl/source/cookies/base-html-sheet.lisp
0 → 100755
View file @
42d3dc8c
This diff is collapsed.
Click to expand it.
gwl/source/cookies/macros.lisp
0 → 100755
View file @
42d3dc8c
;;
;; Copyright 2002-2011 Genworks International
;;
;; This source file is part of the General-purpose Declarative
;; Language project (GDL).
;;
;; This source file contains free software: you can redistribute it
;; and/or modify it under the terms of the GNU Affero General Public
;; License as published by the Free Software Foundation, either
;; version 3 of the License, or (at your option) any later version.
;;
;; This source file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public
;; License along with this source file. If not, see
;; <http://www.gnu.org/licenses/>.
;;
(
in-package
:gwl
)
(
defmacro
with-all-servers
((
server
)
&rest
body
)
(
let
((
server-var
(
gensym
)))
`
(
dolist
(
,
server-var
(
list
*wserver*
*ssl-server*
))
(
when
,
server-var
(
let
((
,
server
,
server-var
))
,@
body
)))))
(
define-object
form-mixin
())
(
define-lens
(
html-format
form-mixin
)()
:output-functions
((
:form
(
slot-names
&key
(
size-default
5
)
(
sizes
(
make-list
(
length
slot-names
)
:initial-element
size-default
))
(
prompts
(
mapcar
#'
(
lambda
(
slot-name
)
(
symbol-name
slot-name
))
slot-names
))
(
cellpadding
0
)
(
heading-color
:yellow
))
(
html
(
:p
((
:table
:cellpadding
cellpadding
)
(
:tr
((
:th
:colspan
2
)
"Dimensions"
))
(
mapc
#'
(
lambda
(
slot-name
prompt
size
)
(
html
(
:tr
((
:td
:bgcolor
heading-color
)
(
:princ
(
string-capitalize
prompt
)))
(
:td
((
:input
:type
:text
:name
(
symbol-name
slot-name
)
:size
size
:value
(
or
(
the
(
evaluate
slot-name
))
""
)))))))
slot-names
prompts
sizes
)))
(
:p
((
:input
:type
:submit
:name
:subbmit
:value
" OK "
)))))))
(
defmacro
html-form
(
slot-names
&key
(
size-default
5
)
(
sizes
(
make-list
(
length
slot-names
)
:initial-element
size-default
))
(
prompts
(
mapcar
#'
(
lambda
(
slot-name
)
(
symbol-name
slot-name
))
slot-names
))
(
cellpadding
0
)
(
heading-color
:yellow
))
`
(
html
(
:p
((
:table
:cellpadding
,
cellpadding
)
(
:tr
((
:th
:colspan
2
)
"Dimensions"
))
,@
(
mapcar
#'
(
lambda
(
slot-name
prompt
size
)
`
(
:tr
((
:td
:bgcolor
,
heading-color
)
(
:princ
,
(
string-capitalize
prompt
)))
(
:td
((
:input
:type
:text
:name
,
(
symbol-name
slot-name
)
:size
,
size
:value
(
or
(
the
,
slot-name
)
""
))))))
slot-names
prompts
sizes
)))
(
:p
((
:input
:type
:submit
:name
:subbmit
:value
" OK "
)))))
(
defmacro
with-html-form
((
&key
name
multipart?
enctype
target
requestor
on-submit
suppress-border?
local-anchor
cl-who?
)
&body
body
)
"Enclose a body of code with a form.
FLAG -- fill in.
"
(
let
((
%enctype%
(
gensym
))
;;(fixed-prefix (gensym))
)
`
(
let
((
,
%enctype%
(
cond
(
,
enctype
,
enctype
)
(
,
multipart?
"multipart/form-data"
)))
;;(,fixed-prefix (the fixed-url-prefix))
)
(
,@
(
if
cl-who?
'
(
with-html-output
(
*stream*
nil
:indent
t
))
'
(
html
;;html-stream *stream*
))
((
:form
:method
:|post|
:action
(
string-append
""
;;(or ,fixed-prefix "")
(
format
nil
(
if
,
local-anchor
(
format
nil
"/answer#~a"
,
local-anchor
)
"/answer"
)))
:name
,
(
or
name
`
(
the
root-path-string
))
,@
(
if
cl-who?
`
(
:enctype
,
%enctype%
)
`
(
:if*
,
%enctype%
:enctype
,
%enctype%
))
,@
(
if
cl-who?
`
(
:target
,
target
)
`
(
:if*
,
target
:target
,
target
))
,@
(
if
cl-who?
`
(
:on-submit
,
on-submit
)
`
(
:if*
,
on-submit
:onsubmit
,
on-submit
))
,@
(
if
cl-who?
`
(
:style
,
(
when
suppress-border?
"padding: 0; border: 0; margin: 0"
))
`
(
:if*
,
suppress-border?
:style
"padding: 0; border: 0; margin: 0"
)))
((
:input
:type
:hidden
:name
:|requestor|
:value
,
(
if
(
null
requestor
)
`
(
the
url-encoded-root-path
)
`
(
the-object
,
requestor
url-encoded-root-path
))))
((
:input
:type
:hidden
:name
:|iid|
:value
(
the
instance-id
)))
,@
body
)))))
gwl/source/cookies/new-urls.lisp
0 → 100755
View file @
42d3dc8c
;;
;; Copyright 2002-2011 Genworks International
;;
;; This source file is part of the General-purpose Declarative
;; Language project (GDL).
;;
;; This source file contains free software: you can redistribute it
;; and/or modify it under the terms of the GNU Affero General Public
;; License as published by the Free Software Foundation, either
;; version 3 of the License, or (at your option) any later version.
;;
;; This source file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public
;; License along with this source file. If not, see
;; <http://www.gnu.org/licenses/>.
;;
(
in-package
:gwl
)
(
defun
compute-url
(
root-path
)
(
if
(
null
root-path
)
"index.html"
(
format
nil
"~{~(~a~)/~}index.html"
(
mapcar
#'
(
lambda
(
component
)
(
if
(
listp
component
)
(
format
nil
"~a/~a"
(
first
component
)
(
second
component
))
component
))
(
reverse
root-path
)))))
(
defun
compute-root-path
(
root-path-components
)
(
let
((
result-list
nil
))
(
do
((
component
(
pop
root-path-components
)
(
pop
root-path-components
)))
((
null
component
)
(
nreverse
result-list
))
(
cond
((
string-equal
component
"index.html"
))
((
numberp
(
read-from-string
component
))
(
let
((
part
(
pop
root-path-components
)))
(
push
(
list
(
make-keyword
part
)
(
read-from-string
component
))
result-list
)))
(
t
(
push
(
make-keyword
component
)
result-list
))))))
;;
;; FLAG -- start using ensure-keyword here.
;;
(
defun
present-part
(
req
ent
url
&key
instance-id
header-plist
fixed-prefix
)
(
declare
(
ignore
header-plist
))
(
when
(
and
fixed-prefix
(
string-equal
(
subseq
url
(
1+
(
length
fixed-prefix
))
(
+
1
(
length
fixed-prefix
)
(
length
"/sessions"
)))
"/sessions"
))
(
setq
url
(
subseq
url
(
1+
(
length
fixed-prefix
)))))
(
let*
(
;;(cookies (when *process-cookies?* (get-cookie-values req)))
(
components
(
split
url
#\/
))
(
cookies
(
unless
(
string-equal
(
first
components
)
"sessions"
)
(
get-cookie-values
req
))))
(
let*
((
hash-entry
(
or
(
gethash
(
ensure-keyword
(
or
instance-id
(
cdr
(
assoc
"iid"
cookies
:test
#'
string-equal
))
(
second
components
)))
*instance-hash-table*
)
(
error
"object not found - must add logic to create new instance~%"
)))
(
root-object
(
first
hash-entry
))
(
skin
(
third
hash-entry
))
(
root-path
(
multiple-value-bind
(
value
found?
)
(
gethash
url
*descriptive-url-hash*
)
(
if
found?
value
(
compute-root-path
(
reverse
(
if
instance-id
components
(
rest
(
rest
components
))))))))
(
respondent
(
when
root-object
(
the-object
root-object
(
follow-root-path
root-path
)))))
(
when
*debug?*
(
print-variables
components
instance-id
root-object
root-path
respondent
))
;;
;; FLAG -- use actual application-root rather than global root here
;;
(
when
(
and
respondent
(
the-object
respondent
root
)
(
typep
(
the-object
respondent
root
)
'session-control-mixin
))
(
the-object
respondent
root
(
set-expires-at
)))
(
when
(
and
respondent
(
the-object
respondent
root
)
(
the-object
respondent
root
(
set-time-last-touched!
))))
(
when
(
and
respondent
(
the-object
respondent
root
)
(
the-object
respondent
root
(
set-slot!
:last-visited-root-path
root-path
))))
(
when
(
and
respondent
(
the-object
respondent
root
)
(
the-object
respondent
root
(
set-remote-host!
req
))))
(
when
(
and
*process-cookies?*
respondent
)
(
the-object
respondent
(
set-slot!
:cookies-received
cookies
)))
(
when
*process-cookies?*
(
the-object
respondent
process-cookies!
))
(
let
((
header-plist
(
the-object
respondent
header-plist
))
(
security-ok?
(
the-object
respondent
root
do-security-check
)))
(
cond
((
and
respondent
security-ok?
)
(
with-http-response
(
req
ent
:response
(
cond
((
getf
header-plist
:location
)
*response-moved-permanently*
)
(
t
*response-ok*
)))
(
setf
(
reply-header-slot-value
req
:cache-control
)
"no-cache"
)
(
setf
(
reply-header-slot-value
req
:pragma
)
"no-cache"
)
(
mapc
#'
(
lambda
(
key
val
)
(
setf
(
reply-header-slot-value
req
key
)
val
))
(
plist-keys
header-plist
)
(
plist-values
header-plist
))
(
when
*process-cookies?*
(
mapc
#'
(
lambda
(
plist
)
(
apply
#'
set-cookie-header
req
plist
))
(
the-object
respondent
cookies-to-send
)))
(
with-http-body
(
req
ent
)
(
when
(
null
(
getf
header-plist
:location
))
(
let
((
*req*
req
)
(
*ent*
ent
)
(
*skin*
skin
))
(
the-object
respondent
(
:before-present!
))
(
let
((
*stream*
*html-stream*
))
(
the-object
respondent
(
:write-html-sheet
)))
(
the-object
respondent
(
:after-present!
)))))))
(
respondent
(
with-http-response
(
req
ent
)
(
setf
(
reply-header-slot-value
req
:cache-control
)
"no-cache"
)
(
setf
(
reply-header-slot-value
req
:pragma
)
"no-cache"
)
(
with-http-body
(
req
ent
)
(
the-object
respondent
root
security-check-failed
write-html-sheet
))))
(
t
(
net.aserve::failed-request
req
)))))))
regression/data/conic-curve-test.data
0 → 100644
View file @
42d3dc8c
((((#(-10.0 0.0 0.0) #(0.0 99.99999999999984 0.0) #(10.0 0.0 0.0))
(1.0 0.1363636363636366 1.0) (0.0 0.0 0.0 1.0 1.0 1.0) 2)
((#(-10.0 0.0 0.0) #(-9.875819308884065 1.2383128245475397 0.0)
#(-9.61729059529058 2.613136772273812 0.0)
#(-9.129868173198693 4.03340003836246 0.0))
(#(-9.129868173198693 4.03340003836246 0.0)
#(-8.804919891804103 4.980242215754894 0.0)
#(-8.37824107329911 5.947279645752827 0.0)
#(-7.828669671748748 6.875733564977329 0.0))
(#(-7.828669671748748 6.875733564977329 0.0)
#(-7.279098270198386 7.8041874842018295 0.0)
#(-6.606634285602657 8.694057892652898 0.0)
#(-5.814305153518269 9.46177679537728 0.0))
(#(-5.814305153518269 9.46177679537728 0.0)
#(-5.021976021433881 10.229495698101662 0.0)
#(-4.109781741860836 10.87506309509936 0.0)
#(-3.121140968925133 11.318603654539292 0.0))
(#(-3.121140968925133 11.318603654539292 0.0)
#(-2.6268205824572814 11.540373934259257 0.0)
#(-2.113388572648766 11.711637504589781 0.0)
#(-1.5900131406044662 11.825813218143463 0.0))
(#(-1.5900131406044662 11.825813218143463 0.0)
#(-0.543262276515868 12.054164645250829 0.0)
#(0.5432622765158654 12.054164645250829 0.0)
#(1.590013140604466 11.825813218143466 0.0))
(#(1.590013140604466 11.825813218143466 0.0)
#(2.1133885726487662 11.711637504589783 0.0)
#(2.626820582457283 11.54037393425926 0.0)
#(3.1211409689251344 11.318603654539295 0.0))
(#(3.1211409689251344 11.318603654539295 0.0)
#(4.109781741860841 10.875063095099366 0.0)
#(5.021976021433888 10.229495698101665 0.0)
#(5.814305153518276 9.46177679537728 0.0))
(#(5.814305153518276 9.46177679537728 0.0)
#(6.606634285602663 8.694057892652896 0.0)
#(7.279098270198393 7.804187484201829 0.0)
#(7.828669671748752 6.8757335649773275 0.0))
(#(7.828669671748752 6.8757335649773275 0.0)
#(8.378241073299112 5.947279645752827 0.0)
#(8.804919891804103 4.980242215754893 0.0)
#(9.129868173198695 4.03340003836246 0.0))
(#(9.129868173198695 4.03340003836246 0.0)
#(9.61729059529058 2.613136772273811 0.0)
#(9.875819308884068 1.2383128245475414 0.0) #(10.0 0.0 0.0)))))
\ No newline at end of file
regression/source/iges-writer.lisp
View file @
42d3dc8c
;;
;; Copyright 2002, 2009 Genworks International and Genworks BV
;;
;; This source file is part of the General-purpose Declarative
;; Language project (GDL).
;;
;; This source file contains free software: you can redistribute it
;; and/or modify it under the terms of the GNU Affero General Public
;; License as published by the Free Software Foundation, either
;; version 3 of the License, or (at your option) any later version.
;;
;; This source file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public
;; License along with this source file. If not, see
;; <http://www.gnu.org/licenses/>.
;;
(
in-package
:gdl-lift-tests
)
(
define-object
iges-writer-test
(
base-object
)
:computed-slots
((
output-file-name
(
let
((
output
(
merge-pathnames
"round-trip.igs"
gdl-lift-utils::*lift-data-directory*
)))
(
with-format
(
iges
output
)
(
write-the
test-part
(
breps
0
)
cad-output
))
output
))
(
regression-test-data
(
progn
(
warn
"Iges-writer-test is failing, check input of type iges-reader"
)
nil
))
#+
nil
(
regression-test-data
(
append
(
multiple-value-list
(
the
input
(
breps
0
)
precise-properties
))
(
the
input
(
breps
0
)
%curves-to-draw%
)
(
the
input
(
breps
0
)
%lines-to-draw%
))))
:objects
((
test-part
:type
'native-reader
:file-name
(
merge-pathnames
"iraro.iwp"
gdl-lift-utils::*lift-data-directory*
))
(
input
:type
'iges-reader
:file-name
(
the
output-file-name
)
;;:make-single-brep? t
)))
(
define-object
iges-writer-test-2
(
base-object
)
:computed-slots
((
output-file-name
(
let
((
output
(
merge-pathnames
"round-trip-2.igs"
gdl-lift-utils::*lift-data-directory*
)))
(
with-format
(
iges
output
)
(
write-the
test-part
(
breps
0
)
cad-output
))
output
))
(
regression-test-data
(
append
(
multiple-value-list
(
the
input
(
breps
0
)
precise-properties
))
(
the
input
(
breps
0
)
%curves-to-draw%
)
(
the
input
(
breps
0
)
%lines-to-draw%
))))
:objects
((
test-part
:type
'iges-reader
:make-single-brep?
t
:file-name
(
merge-pathnames
"nurb_fillet.igs"
gdl-lift-utils::*lift-data-directory*
))
(
input
:type
'iges-reader
:file-name
(
the
output-file-name
)
:make-single-brep?
t
)))
(
register-test-definition
'iges-writer-test
)
;;
;; Output tests
;;
(
define-object
iges-test-tree
(
base-object
)
:objects
((
b-spline-curve
:type
'test-b-spline-curves
)
(
fitted-curve
:type
'test-fitted-curve
)
;(arc-curve :type 'test-arc-curve)
(
linear-curve
:type
'test-linear-curve
)
;(curve-from-line :type 'l-line :start (make-point 0 0 0)
; :end (make-point 10 10 0))
(
curve-from-arc
:type
'arc
:center
(
make-point
0
0
0
)
:radius
10
:start-angle
0
:end-angle
pi
)
(
b-spline-surface
:type
'test-b-spline-surface
)
(
fitted-surface
:type
'test-fitted-surface
)
(
planar-surface
:type
'test-planar-surface
)
(
rectangular-surface
:type
'test-rectangular-surface
)
(
spherical-surface
:type
'test-spherical-surface
)
(
spherical-surface-2
:type
'spherical-surface
:radius
0.5
)
(
spherical-surface-3
:type
'spherical-surface
:radius
0.05
)
(
spherical-surface-4
:type
'spherical-surface
:radius
0.005
)
)
:functions
((
iges-out
()
(
let
((
output-file
(
make-pathname
:directory
(
pathname-directory
(
glisp:temporary-folder
))
:name
"iges-test-tree"
:type
"iges"
)))
(
format
t
"Writing test IGES file to ~a...~%"
output-file
)
(
with-format
(
iges
output-file
)
(
write-the
cad-output-tree
))))))
(
define-object
set-of-points
(
base-object
)
:input-slots
((
centers
(
list
(
the
center
)
(
translate
(
the
center
)
:right
1
)
(
translate
(
the
center
)
:left
1
)
(
translate
(
the
center
)
:rear
1
)
(
translate
(
the
center
)
:front
1
)
(
translate
(
the
center
)
:up
1
)
(
translate
(
the
center
)
:down
1
))))
:objects
(
(
points
:type
'point
:sequence
(
:size
(
length
(
the
centers
)))
:center
(
nth
(
the-child
index
)
(
the
centers
)))
(
surface
:type
'test-b-spline-surface
))
:functions
((
iges-out
()
(
let
((
output-path
(
merge-pathnames
"points.iges"
(
glisp:temporary-folder
))))
(
with-format
(
iges
output-path
)
(
write-the
cad-output-tree
))
output-path
))))
;;
;; Copyright 2002, 2009 Genworks International and Genworks BV
;;
;; This source file is part of the General-purpose Declarative
;; Language project (GDL).
;;
;; This source file contains free software: you can redistribute it
;; and/or modify it under the terms of the GNU Affero General Public
;; License as published by the Free Software Foundation, either
;; version 3 of the License, or (at your option) any later version.
;;
;; This source file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public
;; License along with this source file. If not, see
;; <http://www.gnu.org/licenses/>.
;;
(
in-package
:gdl-lift-tests
)
(
define-object
iges-writer-test
(
base-object
)
:computed-slots
((
output-file-name
(
let
((
output
(
merge-pathnames
"round-trip.igs"
gdl-lift-utils::*lift-data-directory*
)))
(
with-format
(
iges
output
)
(
write-the
test-part
(
breps
0
)
cad-output
))
output
))
(
regression-test-data
(
progn
(
warn
"Iges-writer-test is failing, check input of type iges-reader"
)
nil
))
#+
nil
(
regression-test-data
(
append
(
multiple-value-list
(
the
input
(
breps
0
)
precise-properties
))
(
the
input
(
breps
0
)
%curves-to-draw%
)
(
the
input
(
breps
0
)
%lines-to-draw%
))))
:objects
((
test-part
:type
'native-reader
:file-name
(
merge-pathnames
"iraro.iwp"
gdl-lift-utils::*lift-data-directory*
))
(
input
:type
'iges-reader
:file-name
(
the
output-file-name
)
;;:make-single-brep? t
)))
(
define-object
iges-writer-test-2
(
base-object
)
:computed-slots
((
output-file-name
(
let
((
output
(
merge-pathnames
"round-trip-2.igs"
gdl-lift-utils::*lift-data-directory*
)))
(
with-format
(
iges
output
)
(
write-the
test-part
(
breps
0
)
cad-output
))
output
))
(
regression-test-data
(
append
(
multiple-value-list
(
the
input
(
breps
0
)
precise-properties
))
(
the
input
(
breps
0
)
%curves-to-draw%
)
(
the
input
(
breps
0
)
%lines-to-draw%
))))
:objects
((
test-part
:type
'iges-reader
:make-single-brep?
t
:file-name
(
merge-pathnames
"nurb_fillet.igs"
gdl-lift-utils::*lift-data-directory*
))
(
input
:type
'iges-reader
:file-name
(
the
output-file-name
)
:make-single-brep?
t
)))
(
register-test-definition
'iges-writer-test
)
;;
;; Output tests
;;
(
define-object
iges-test-tree
(
base-object
)
:objects
((
b-spline-curve
:type
'test-b-spline-curves
)
(
fitted-curve
:type
'test-fitted-curve
)
;(arc-curve :type 'test-arc-curve)
(
linear-curve
:type
'test-linear-curve
)
;(curve-from-line :type 'l-line :start (make-point 0 0 0)
; :end (make-point 10 10 0))
(
curve-from-arc
:type
'arc
:center
(
make-point
0
0
0
)
:radius
10
:start-angle
0
:end-angle
pi
)
(
b-spline-surface
:type
'test-b-spline-surface
)
(
fitted-surface
:type
'test-fitted-surface
)
(
planar-surface
:type
'test-planar-surface
)
(
rectangular-surface
:type
'test-rectangular-surface
)
(
spherical-surface
:type
'test-spherical-surface
)
(
spherical-surface-2
:type
'spherical-surface
:radius
0.5
)
(
spherical-surface-3
:type
'spherical-surface
:radius
0.05
)
(
spherical-surface-4
:type
'spherical-surface
:radius
0.005
)
)
:functions
((
iges-out
()
(
let
((
output-file
(
make-pathname
:directory
(
pathname-directory
(
glisp:temporary-folder
))
:name
"iges-test-tree"
:type
"iges"
)))
(
format
t
"Writing test IGES file to ~a...~%"
output-file
)
(
with-format
(
iges
output-file
)
(
write-the
cad-output-tree
))))))
(
define-object
set-of-points
(
base-object
)
:input-slots
((
centers
(
list
(
the
center
)
(
translate
(
the
center
)
:right
1
)
(
translate
(
the
center
)
:left
1
)
(
translate
(
the
center
)
:rear
1
)
(
translate
(
the
center
)
:front
1
)
(
translate
(
the
center
)
:up
1
)
(
translate
(
the
center
)
:down
1
))))
:objects
(
(
points
:type
'point
:sequence
(
:size
(
length
(
the
centers
)))
:center
(
nth
(
the-child
index
)
(
the
centers
)))
(
surface
:type
'test-b-spline-surface
))
:functions
((
iges-out
()
(
let
((
output-path
(
merge-pathnames
"points.iges"
(
glisp:temporary-folder
))))
(
with-format
(
iges
output-path
)
(
write-the
cad-output-tree
))
output-path
))))
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment