cadquery
cadquery copied to clipboard
Core dump while (trying to) sweep along unioned shapes
Context : I am trying to build a 2D shape, and sweep an arbitrary profile along its edges.
Not only I fail miserably at this but I even manage to get repeatable core dumps ;) For what it helps, I am a complete newcomer to cadquery but I am skilled in Openscad and many programming languages.
To Reproduce
import cadquery as cq
from cadquery import Workplane
c1s=Workplane("front").polyline([(2,0),(12,0),(11,5)]).close().offset2D(1).extrude(1)
c2s=Workplane("front").circle(6).extrude(1)
s3d = c1s.union(c2s)
s2d = s3d.faces("<Z")
brush = cq.Workplane("XZ").lineTo(0,1).threePointArc( (0.5,.5), (0,0) ).close() # provokes a core dump
# brush = cq.Workplane("XZ").circle(1) # results in a seriously broken object
result = brush.sweep(s2d.wires()).translate((0,0,5))
I am most certainly writing poor code but I failed to find how to unionize in 2D in the first place. This is the reason of such a convoluted extrusion + selection of <Z faces : pleeease do correct me on this matter by the way, I spent more than a day trying to get the thing done. The only option I found was to discretize the edges (or build them manually) and generate polyhedrons. This is so slow and ugly (faceted) that I would better use Openscad if I do it this way ;)
The above result is when I use a simpler "brush" to sweep the unioned shape. Otherwise with the crash I get nothing obviously.
$ python core_dump.py
Segmentation fault (core dumped)
Backtrace
With the "complex" brush, cq-editor
exits with a core dump and no backtrace. With the simple circular brush there is no error, but the resulting shapes is impossible to explain in my opinion. It relly does not look like I succedded in making a rounded edge around my 2D shape ;)
gdb
tells me this
Thread 1 "python" received signal SIGSEGV, Segmentation fault.
0x00007fffece560d0 in TopoDS_Builder::Add(TopoDS_Shape&, TopoDS_Shape const&) const () from /home/jeremie/miniconda3/envs/cadquery/lib/python3.9/site-packages/../../libTKBRep.so.7
Environment
OS: Linux 5.4.0-92-generic #103-Ubuntu SMP Fri Nov 26 16:13:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Cadquery installed with miniconda
Output of conda list
from your active Conda environment:
$ conda list
# packages in environment at /home/jeremie/miniconda3/envs/cadquery:
#
# Name Version Build Channel
_libgcc_mutex 0.1 conda_forge conda-forge
_openmp_mutex 4.5 1_gnu conda-forge
alabaster 0.7.12 py_0 conda-forge
alsa-lib 1.2.3 h516909a_0 conda-forge
aom 3.2.0 h9c3ff4c_2 conda-forge
argh 0.26.2 pyh9f0ad1d_1002 conda-forge
astroid 2.9.3 py39hf3d152e_0 conda-forge
asttokens 2.0.5 pyhd8ed1ab_0 conda-forge
atomicwrites 1.4.0 pyh9f0ad1d_0 conda-forge
attrs 21.4.0 pyhd8ed1ab_0 conda-forge
autopep8 1.5.6 pyhd8ed1ab_0 conda-forge
babel 2.9.1 pyh44b312d_0 conda-forge
backcall 0.2.0 pyh9f0ad1d_0 conda-forge
backports 1.0 py_2 conda-forge
backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge
black 21.12b0 pyhd8ed1ab_0 conda-forge
bleach 4.1.0 pyhd8ed1ab_0 conda-forge
brotlipy 0.7.0 py39h3811e60_1003 conda-forge
bzip2 1.0.8 h7f98852_4 conda-forge
c-ares 1.18.1 h7f98852_0 conda-forge
ca-certificates 2021.10.8 ha878542_0 conda-forge
cadquery master py3.9 cadquery
certifi 2021.10.8 py39hf3d152e_1 conda-forge
cffi 1.15.0 py39h4bc2ebd_0 conda-forge
chardet 4.0.0 py39hf3d152e_2 conda-forge
charset-normalizer 2.0.10 pyhd8ed1ab_0 conda-forge
click 8.0.3 py39hf3d152e_1 conda-forge
cloudpickle 2.0.0 pyhd8ed1ab_0 conda-forge
colorama 0.4.4 pyh9f0ad1d_0 conda-forge
cq-editor master py3.9 cadquery
cq-warehouse 0.5.1 pypi_0 pypi
cqkit 0.4.0 pypi_0 pypi
cqmore 0.1 pypi_0 pypi
cryptography 36.0.1 py39h95dcef6_0 conda-forge
curl 7.81.0 h2574ce0_0 conda-forge
dataclasses 0.8 pyhc8e2a94_3 conda-forge
dbus 1.13.6 h5008d03_3 conda-forge
debugpy 1.5.1 py39he80948d_0 conda-forge
decorator 5.1.1 pyhd8ed1ab_0 conda-forge
defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge
diff-match-patch 20200713 pyh9f0ad1d_0 conda-forge
docutils 0.17.1 py39hf3d152e_1 conda-forge
double-conversion 3.1.7 h9c3ff4c_0 conda-forge
eigen 3.4.0 h4bd325d_0 conda-forge
entrypoints 0.3 pyhd8ed1ab_1003 conda-forge
executing 0.8.2 pyhd8ed1ab_0 conda-forge
expat 2.4.3 h9c3ff4c_0 conda-forge
ezdxf 0.17.2 py39h1a9c180_0 conda-forge
ffmpeg 4.4.1 h6987444_0 conda-forge
flake8 3.8.4 py_0 conda-forge
font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge
font-ttf-inconsolata 3.000 h77eed37_0 conda-forge
font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge
font-ttf-ubuntu 0.83 hab24e00_0 conda-forge
fontconfig 2.13.1 hba837de_1005 conda-forge
fonts-conda-ecosystem 1 0 conda-forge
fonts-conda-forge 1 0 conda-forge
freeimage 3.18.0 h88c329d_7 conda-forge
freetype 2.10.4 h0708190_1 conda-forge
future 0.18.2 py39hf3d152e_4 conda-forge
gettext 0.19.8.1 h73d1719_1008 conda-forge
gl2ps 1.4.2 h0708190_0 conda-forge
glew 2.1.0 h9c3ff4c_2 conda-forge
gmp 6.2.1 h58526e2_0 conda-forge
gnutls 3.6.13 h85f3911_1 conda-forge
gst-plugins-base 1.18.5 hf529b03_3 conda-forge
gstreamer 1.18.5 h9f60fe5_3 conda-forge
hdf4 4.2.15 h10796ff_3 conda-forge
hdf5 1.10.6 nompi_h6a2412b_1114 conda-forge
icu 69.1 h9c3ff4c_0 conda-forge
idna 3.3 pyhd8ed1ab_0 conda-forge
ilmbase 2.5.5 h780b84a_0 conda-forge
imagesize 1.3.0 pyhd8ed1ab_0 conda-forge
importlib-metadata 4.10.1 py39hf3d152e_0 conda-forge
importlib_metadata 4.10.1 hd8ed1ab_0 conda-forge
importlib_resources 5.4.0 pyhd8ed1ab_0 conda-forge
intervaltree 3.0.2 py_0 conda-forge
ipykernel 6.7.0 py39hef51801_0 conda-forge
ipython 8.0.1 py39hf3d152e_0 conda-forge
ipython_genutils 0.2.0 py_1 conda-forge
isort 5.10.1 pyhd8ed1ab_0 conda-forge
jbig 2.1 h7f98852_2003 conda-forge
jedi 0.17.2 py39hf3d152e_2 conda-forge
jeepney 0.7.1 pyhd8ed1ab_0 conda-forge
jinja2 3.0.3 pyhd8ed1ab_0 conda-forge
jpeg 9d h36c2ea0_0 conda-forge
jsoncpp 1.9.4 h4bd325d_3 conda-forge
jsonschema 4.4.0 pyhd8ed1ab_0 conda-forge
jupyter_client 7.1.2 pyhd8ed1ab_0 conda-forge
jupyter_core 4.9.1 py39hf3d152e_1 conda-forge
jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge
jxrlib 1.1 h7f98852_2 conda-forge
keyring 23.4.0 py39hf3d152e_0 conda-forge
krb5 1.19.2 hcc1bbae_3 conda-forge
lame 3.100 h7f98852_1001 conda-forge
lazy-object-proxy 1.7.1 py39h3811e60_0 conda-forge
lcms2 2.12 hddcbb42_0 conda-forge
ld_impl_linux-64 2.36.1 hea4e1c9_2 conda-forge
lerc 3.0 h9c3ff4c_0 conda-forge
libblas 3.9.0 13_linux64_openblas conda-forge
libcblas 3.9.0 13_linux64_openblas conda-forge
libclang 13.0.0 default_hc23dcda_0 conda-forge
libcurl 7.81.0 h2574ce0_0 conda-forge
libdeflate 1.8 h7f98852_0 conda-forge
libdrm 2.4.109 h7f98852_0 conda-forge
libedit 3.1.20191231 he28a2e2_2 conda-forge
libev 4.33 h516909a_1 conda-forge
libevent 2.1.10 h9b69904_4 conda-forge
libffi 3.4.2 h7f98852_5 conda-forge
libgcc-ng 11.2.0 h1d223b6_11 conda-forge
libgfortran-ng 11.2.0 h69a702a_11 conda-forge
libgfortran5 11.2.0 h5c6108e_11 conda-forge
libglib 2.70.2 h174f98d_1 conda-forge
libglu 9.0.0 he1b5a44_1001 conda-forge
libgomp 11.2.0 h1d223b6_11 conda-forge
libiconv 1.16 h516909a_0 conda-forge
liblapack 3.9.0 13_linux64_openblas conda-forge
libllvm13 13.0.0 hf817b99_0 conda-forge
libnetcdf 4.8.1 nompi_hcd642e3_100 conda-forge
libnghttp2 1.43.0 h812cca2_1 conda-forge
libnsl 2.0.0 h7f98852_0 conda-forge
libogg 1.3.4 h7f98852_1 conda-forge
libopenblas 0.3.18 pthreads_h8fe5266_0 conda-forge
libopus 1.3.1 h7f98852_1 conda-forge
libpciaccess 0.16 h516909a_0 conda-forge
libpng 1.6.37 h21135ba_2 conda-forge
libpq 14.1 hd57d9b9_1 conda-forge
libraw 0.20.2 h10796ff_1 conda-forge
libsodium 1.0.18 h36c2ea0_1 conda-forge
libspatialindex 1.9.3 h9c3ff4c_4 conda-forge
libssh2 1.10.0 ha56f1ee_2 conda-forge
libstdcxx-ng 11.2.0 he4da1e4_11 conda-forge
libtheora 1.1.1 h7f98852_1005 conda-forge
libtiff 4.3.0 h6f004c6_2 conda-forge
libuuid 2.32.1 h7f98852_1000 conda-forge
libva 2.13.0 h7f98852_2 conda-forge
libvorbis 1.3.7 h9c3ff4c_0 conda-forge
libvpx 1.11.0 h9c3ff4c_3 conda-forge
libwebp-base 1.2.2 h7f98852_1 conda-forge
libxcb 1.13 h7f98852_1004 conda-forge
libxkbcommon 1.0.3 he3ba5ed_0 conda-forge
libxml2 2.9.12 h885dcf4_1 conda-forge
libzip 1.8.0 h4de3113_1 conda-forge
libzlib 1.2.11 h36c2ea0_1013 conda-forge
logbook 1.5.3 py39h3811e60_5 conda-forge
loguru 0.5.3 py39hf3d152e_3 conda-forge
lz4-c 1.9.3 h9c3ff4c_1 conda-forge
markupsafe 2.0.1 py39h3811e60_1 conda-forge
matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge
mccabe 0.6.1 py_1 conda-forge
mistune 0.8.4 py39h3811e60_1005 conda-forge
multimethod 1.6 pyhd8ed1ab_0 conda-forge
mypy_extensions 0.4.3 py39hf3d152e_4 conda-forge
mysql-common 8.0.28 ha770c72_0 conda-forge
mysql-libs 8.0.28 hfa10184_0 conda-forge
nbclient 0.5.10 pyhd8ed1ab_1 conda-forge
nbconvert 6.4.0 py39hf3d152e_0 conda-forge
nbformat 5.1.3 pyhd8ed1ab_0 conda-forge
ncurses 6.3 h9c3ff4c_0 conda-forge
nest-asyncio 1.5.4 pyhd8ed1ab_0 conda-forge
nettle 3.6 he412f7d_0 conda-forge
nlopt 2.7.1 py39h3e08f04_0 conda-forge
nptyping 1.4.4 pyhd8ed1ab_0 conda-forge
nspr 4.32 h9c3ff4c_1 conda-forge
nss 3.74 hb5efdd6_0 conda-forge
numpy 1.22.1 py39h91f2184_0 conda-forge
numpydoc 1.1.0 py_1 conda-forge
occt 7.5.3 h7391655_0 conda-forge
ocp 7.5.3.0 py39_3 cadquery
openexr 2.5.5 hf817b99_0 conda-forge
openh264 2.1.1 h780b84a_0 conda-forge
openjpeg 2.4.0 hb52868f_1 conda-forge
openssl 1.1.1l h7f98852_0 conda-forge
packaging 21.3 pyhd8ed1ab_0 conda-forge
pandoc 2.17.0.1 h7f98852_0 conda-forge
pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge
parso 0.7.0 pyh9f0ad1d_0 conda-forge
path 16.3.0 py39hf3d152e_0 conda-forge
path.py 12.5.0 0 conda-forge
pathspec 0.9.0 pyhd8ed1ab_0 conda-forge
pcre 8.45 h9c3ff4c_0 conda-forge
pexpect 4.8.0 pyh9f0ad1d_2 conda-forge
pickleshare 0.7.5 py_1003 conda-forge
pip 21.3.1 pyhd8ed1ab_0 conda-forge
platformdirs 2.3.0 pyhd8ed1ab_0 conda-forge
pluggy 1.0.0 py39hf3d152e_2 conda-forge
proj 7.2.0 h277dcde_2 conda-forge
prompt-toolkit 3.0.24 pyha770c72_0 conda-forge
psutil 5.9.0 py39h3811e60_0 conda-forge
pthread-stubs 0.4 h36c2ea0_1001 conda-forge
ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge
pugixml 1.11.4 h9c3ff4c_0 conda-forge
pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge
pycodestyle 2.6.0 pyh9f0ad1d_0 conda-forge
pycparser 2.21 pyhd8ed1ab_0 conda-forge
pydantic 1.9.0 pypi_0 pypi
pydocstyle 6.1.1 pyhd8ed1ab_0 conda-forge
pyflakes 2.2.0 pyh9f0ad1d_0 conda-forge
pygments 2.11.2 pyhd8ed1ab_0 conda-forge
pylint 2.12.2 pyhd8ed1ab_0 conda-forge
pyls-black 0.4.6 pyh9f0ad1d_0 conda-forge
pyls-spyder 0.3.2 pyhd8ed1ab_0 conda-forge
pyopenssl 21.0.0 pyhd8ed1ab_0 conda-forge
pyparsing 3.0.7 pyhd8ed1ab_0 conda-forge
pyqt 5.12.3 py39hf3d152e_8 conda-forge
pyqt-impl 5.12.3 py39hde8b62d_8 conda-forge
pyqt5-sip 4.19.18 py39he80948d_8 conda-forge
pyqtchart 5.12 py39h0fcd23e_8 conda-forge
pyqtgraph 0.12.3 pyhd8ed1ab_0 conda-forge
pyqtwebengine 5.12.1 py39h0fcd23e_8 conda-forge
pyrsistent 0.18.1 py39h3811e60_0 conda-forge
pysocks 1.7.1 py39hf3d152e_4 conda-forge
python 3.9.9 h62f1059_0_cpython conda-forge
python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge
python-jsonrpc-server 0.4.0 pyh9f0ad1d_0 conda-forge
python-language-server 0.36.2 pyhd8ed1ab_0 conda-forge
python_abi 3.9 2_cp39 conda-forge
pytz 2021.3 pyhd8ed1ab_0 conda-forge
pyxdg 0.27 pyhd8ed1ab_0 conda-forge
pyyaml 6.0 py39h3811e60_3 conda-forge
pyzmq 22.3.0 py39h37b5a0c_1 conda-forge
qdarkstyle 3.0.3 pyhd8ed1ab_0 conda-forge
qt 5.12.9 ha98a1a1_5 conda-forge
qtawesome 1.1.1 pyhd8ed1ab_0 conda-forge
qtconsole 5.2.2 pyhd8ed1ab_1 conda-forge
qtconsole-base 5.2.2 pyhd8ed1ab_1 conda-forge
qtpy 2.0.0 pyhd8ed1ab_0 conda-forge
rapidjson 1.1.0 he1b5a44_1002 conda-forge
readline 8.1 h46c0cb4_0 conda-forge
requests 2.27.1 pyhd8ed1ab_0 conda-forge
rope 0.22.0 pyhd8ed1ab_0 conda-forge
rtree 0.9.7 py39hb102c33_3 conda-forge
scipy 1.7.3 pypi_0 pypi
secretstorage 3.3.1 py39hf3d152e_1 conda-forge
setuptools 60.5.0 py39hf3d152e_0 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
snowballstemmer 2.2.0 pyhd8ed1ab_0 conda-forge
sortedcontainers 2.4.0 pyhd8ed1ab_0 conda-forge
sphinx 4.4.0 pyh6c4a22f_1 conda-forge
sphinxcontrib-applehelp 1.0.2 py_0 conda-forge
sphinxcontrib-devhelp 1.0.2 py_0 conda-forge
sphinxcontrib-htmlhelp 2.0.0 pyhd8ed1ab_0 conda-forge
sphinxcontrib-jsmath 1.0.1 py_0 conda-forge
sphinxcontrib-qthelp 1.0.3 py_0 conda-forge
sphinxcontrib-serializinghtml 1.1.5 pyhd8ed1ab_1 conda-forge
spyder 4.2.1 py39hf3d152e_3 conda-forge
spyder-kernels 1.10.2 py39hf3d152e_0 conda-forge
sqlite 3.37.0 h9cd32fc_0 conda-forge
stack_data 0.1.4 pyhd8ed1ab_0 conda-forge
svgpathtools 1.4.4 pypi_0 pypi
svgwrite 1.4.1 pypi_0 pypi
svt-av1 0.9.0 h9c3ff4c_0 conda-forge
tbb 2020.2 h4bd325d_4 conda-forge
tbb-devel 2020.2 h4bd325d_4 conda-forge
testpath 0.5.0 pyhd8ed1ab_0 conda-forge
textdistance 4.2.2 pyhd8ed1ab_0 conda-forge
three-merge 0.1.1 pyh9f0ad1d_0 conda-forge
tk 8.6.11 h27826a3_1 conda-forge
toml 0.10.2 pyhd8ed1ab_0 conda-forge
tomli 1.2.2 pyhd8ed1ab_0 conda-forge
tornado 6.1 py39h3811e60_2 conda-forge
traitlets 5.1.1 pyhd8ed1ab_0 conda-forge
typed-ast 1.5.2 py39h3811e60_0 conda-forge
typing-extensions 4.0.1 hd8ed1ab_0 conda-forge
typing_extensions 4.0.1 pyha770c72_0 conda-forge
typish 1.9.3 pyhd8ed1ab_0 conda-forge
tzdata 2021e he74cb21_0 conda-forge
ujson 5.1.0 py39he80948d_0 conda-forge
urllib3 1.26.8 pyhd8ed1ab_1 conda-forge
utfcpp 3.2.1 ha770c72_0 conda-forge
vtk 9.0.1 qt_py39hd1b08ba_210 conda-forge
watchdog 2.1.6 py39hf3d152e_1 conda-forge
wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge
webencodings 0.5.1 py_1 conda-forge
wheel 0.37.1 pyhd8ed1ab_0 conda-forge
wrapt 1.13.3 py39h3811e60_1 conda-forge
wurlitzer 3.0.2 py39hf3d152e_1 conda-forge
x264 1!161.3030 h7f98852_1 conda-forge
x265 3.5 h4bd325d_1 conda-forge
xorg-fixesproto 5.0 h7f98852_1002 conda-forge
xorg-kbproto 1.0.7 h7f98852_1002 conda-forge
xorg-libice 1.0.10 h7f98852_0 conda-forge
xorg-libsm 1.2.3 hd9c2040_1000 conda-forge
xorg-libx11 1.7.2 h7f98852_0 conda-forge
xorg-libxau 1.0.9 h7f98852_0 conda-forge
xorg-libxdmcp 1.1.3 h7f98852_0 conda-forge
xorg-libxext 1.3.4 h7f98852_1 conda-forge
xorg-libxfixes 5.0.3 h7f98852_1004 conda-forge
xorg-libxt 1.2.1 h7f98852_2 conda-forge
xorg-xextproto 7.3.0 h7f98852_1002 conda-forge
xorg-xproto 7.0.31 h7f98852_1007 conda-forge
xz 5.2.5 h516909a_1 conda-forge
yaml 0.2.5 h7f98852_2 conda-forge
yapf 0.32.0 pyhd8ed1ab_0 conda-forge
zeromq 4.3.4 h9c3ff4c_1 conda-forge
zipp 3.7.0 pyhd8ed1ab_0 conda-forge
zlib 1.2.11 h36c2ea0_1013 conda-forge
zstd 1.5.2 ha95c52a_0 conda-forge
Hello, several points here :
- To add and substract 2D shapes use
Sketch
https://cadquery.readthedocs.io/en/latest/sketch.html?highlight=sketch - OpenSCAD users tend to use in Cadquery the same mindset they have for 3D modeling in OpenSCAD, you shouldn't! The workflow is different and if you don't use it as intended you will struggle a lot more than you should. In essence you almost never need to use
ùnion
,cut
andintersect
, there are methods available to add and remove matter, use them ! - Finally for the sweep to work you need to place your "brush" on your path wire. (I just modified slightly your code, but it's very suboptimal, please refers to the advices above to improve it)
import cadquery as cq
from cadquery import Workplane
c1s=Workplane("front").polyline([(2,0),(12,0),(11,5)]).close().offset2D(1).extrude(1)
c2s=Workplane("front").circle(6).extrude(1)
s3d = c1s.union(c2s)
s2d = s3d.faces("<Z").wires()
brush = cq.Workplane("XZ", origin=(-6.1,0,-0.5)).lineTo(0,1).threePointArc( (0.5,.5), (0,0) ).close()
s= brush.sweep(s2d)
show_object(s)
show_object(brush, name="brush")
show_object(s2d, name="s2d")
PS : You can actually sweep a section that is not positionned on the path, but most of the time it will give you something you are actually not expecting
Thanks Jojain, this really helps me. And right I feel like something has not yet clicked in my head. Indeed 10 years of OpenSCAD probably make my day harder, but I kept on hittng its limits, hence my attempts at cadquery. It ought to be used more often by the 3DP community. The only good thing is that there is (almost only) one place to find all the doc ;) For a while I did try to use sketches but failed on using them to sweep (convert sketches to wires?). I will try again & once again thanks for the helps & recommendations
I wouldn't say that getting the wire of a face to make a sweep path, is the best way to do it (at least the thinking is a bit off IMO) but it can indeed be simpler for path like you show.
In this case you can retrieve the wire with : Sketch()._faces.Wires()
There is indeed a lot of things in the docs and it's worth reading it again and again, reading source code is also great when you want to do less obvious things. Finally you can ask questions on the discord directly, it's living and you can have direct help if people are available
@MoonCactus may have done something suboptimal or even wrong, but that is not excusing the segfault though. I think there's still something to investigate here.
This may even be worth turning into a test to ensure such things are properly caught