Adding Drawing with Constraints to the docs
Some checks are pending
benchmarks / benchmarks (macos-14, 3.12) (push) Waiting to run
benchmarks / benchmarks (macos-15-intel, 3.12) (push) Waiting to run
benchmarks / benchmarks (ubuntu-latest, 3.12) (push) Waiting to run
benchmarks / benchmarks (windows-latest, 3.12) (push) Waiting to run
Upload coverage reports to Codecov / run (push) Waiting to run
pylint / lint (3.10) (push) Waiting to run
Wheel building and publishing / Build wheel on ubuntu-latest (push) Waiting to run
Wheel building and publishing / upload_pypi (push) Blocked by required conditions
tests / tests (macos-14, 3.10) (push) Waiting to run
tests / tests (macos-14, 3.14) (push) Waiting to run
tests / tests (macos-15-intel, 3.10) (push) Waiting to run
tests / tests (macos-15-intel, 3.14) (push) Waiting to run
tests / tests (ubuntu-latest, 3.10) (push) Waiting to run
tests / tests (ubuntu-latest, 3.14) (push) Waiting to run
tests / tests (windows-latest, 3.10) (push) Waiting to run
tests / tests (windows-latest, 3.14) (push) Waiting to run
Run type checking / typecheck (3.10) (push) Waiting to run
Run type checking / typecheck (3.14) (push) Waiting to run
229
docs/assets/blend_curve_ex.svg
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="122.70103mm" height="99.211064mm" viewBox="-3.115836 -2.239463 5.351298 4.326842" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.00392512451171875">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(214,39,39)" stroke-width="0.00392512451171875" id="m1" stroke-dasharray="0.047101 0.070652">
|
||||
<path d="M -1.015192,0.426352 A 1.0,1.0 0.0 1,1 -2.984808,0.426352" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(252,190,72)" stroke-width="0.00392512451171875" id="m2" stroke-dasharray="0.047101 0.070652">
|
||||
<path d="M 0.4,-0.6 Q 1.176334,-2.903421 2.0,0.0" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(247,126,0)" stroke-width="0.00392512451171875" id="connector">
|
||||
<path d="M -1.015192,0.426352 C -1.049001,0.259629 -1.064717,0.109809 -0.965107,0.021245 C -0.871803,-0.07058 -0.67583,-0.108217 -0.456555,-0.138631 C -0.237655,-0.168993 -0.00811,-0.199198 0.142217,-0.274769 C 0.298101,-0.346975 0.362112,-0.471614 0.4,-0.6" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(171,171,171)" stroke-width="0.00392512451171875" id="comb">
|
||||
<line x1="-2.984808" y1="0.426352" x2="-3.096951" y2="0.406578" />
|
||||
<line x1="-2.991471" y1="0.469672" x2="-3.104373" y2="0.454831" />
|
||||
<line x1="-2.996229" y1="0.513242" x2="-3.109674" y2="0.503362" />
|
||||
<line x1="-2.999074" y1="0.556979" x2="-3.112842" y2="0.55208" />
|
||||
<line x1="-3.0" y1="0.600798" x2="-3.113873" y2="0.600889" />
|
||||
<line x1="-2.999004" y1="0.644616" x2="-3.112764" y2="0.649696" />
|
||||
<line x1="-2.99609" y1="0.688348" x2="-3.109518" y2="0.698409" />
|
||||
<line x1="-2.991262" y1="0.731911" x2="-3.10414" y2="0.746932" />
|
||||
<line x1="-2.984529" y1="0.77522" x2="-3.096641" y2="0.795173" />
|
||||
<line x1="-2.975906" y1="0.818192" x2="-3.087036" y2="0.843038" />
|
||||
<line x1="-2.965408" y1="0.860746" x2="-3.075342" y2="0.890438" />
|
||||
<line x1="-2.953055" y1="0.902798" x2="-3.061583" y2="0.937279" />
|
||||
<line x1="-2.938871" y1="0.944269" x2="-3.045784" y2="0.983472" />
|
||||
<line x1="-2.922884" y1="0.985078" x2="-3.027976" y2="1.028928" />
|
||||
<line x1="-2.905124" y1="1.025148" x2="-3.008194" y2="1.073561" />
|
||||
<line x1="-2.885625" y1="1.064401" x2="-2.986474" y2="1.117284" />
|
||||
<line x1="-2.864425" y1="1.102762" x2="-2.96286" y2="1.160013" />
|
||||
<line x1="-2.841564" y1="1.140157" x2="-2.937396" y2="1.201666" />
|
||||
<line x1="-2.817087" y1="1.176514" x2="-2.910132" y2="1.242164" />
|
||||
<line x1="-2.79104" y1="1.211764" x2="-2.881119" y2="1.281428" />
|
||||
<line x1="-2.763474" y1="1.245839" x2="-2.850413" y2="1.319383" />
|
||||
<line x1="-2.734441" y1="1.278673" x2="-2.818074" y2="1.355956" />
|
||||
<line x1="-2.703997" y1="1.310203" x2="-2.784163" y2="1.391077" />
|
||||
<line x1="-2.6722" y1="1.340369" x2="-2.748746" y2="1.424678" />
|
||||
<line x1="-2.639113" y1="1.369113" x2="-2.711891" y2="1.456695" />
|
||||
<line x1="-2.604797" y1="1.39638" x2="-2.673668" y2="1.487066" />
|
||||
<line x1="-2.56932" y1="1.422116" x2="-2.63415" y2="1.515733" />
|
||||
<line x1="-2.532749" y1="1.446273" x2="-2.593415" y2="1.542641" />
|
||||
<line x1="-2.495155" y1="1.468805" x2="-2.55154" y2="1.567739" />
|
||||
<line x1="-2.456609" y1="1.489667" x2="-2.508605" y2="1.590977" />
|
||||
<line x1="-2.417187" y1="1.508821" x2="-2.464693" y2="1.612312" />
|
||||
<line x1="-2.376963" y1="1.526229" x2="-2.419889" y2="1.631701" />
|
||||
<line x1="-2.336014" y1="1.541857" x2="-2.374278" y2="1.64911" />
|
||||
<line x1="-2.294421" y1="1.555676" x2="-2.327947" y2="1.664502" />
|
||||
<line x1="-2.252261" y1="1.567659" x2="-2.280987" y2="1.67785" />
|
||||
<line x1="-2.209618" y1="1.577783" x2="-2.233487" y2="1.689127" />
|
||||
<line x1="-2.166571" y1="1.586029" x2="-2.185539" y2="1.698312" />
|
||||
<line x1="-2.123205" y1="1.592381" x2="-2.137234" y2="1.705387" />
|
||||
<line x1="-2.079601" y1="1.596827" x2="-2.088666" y2="1.710339" />
|
||||
<line x1="-2.035845" y1="1.599357" x2="-2.039927" y2="1.713158" />
|
||||
<line x1="-1.99202" y1="1.599968" x2="-1.991112" y2="1.713838" />
|
||||
<line x1="-1.948211" y1="1.598658" x2="-1.942313" y2="1.712379" />
|
||||
<line x1="-1.9045" y1="1.595429" x2="-1.893626" y2="1.708783" />
|
||||
<line x1="-1.860974" y1="1.590289" x2="-1.845142" y2="1.703056" />
|
||||
<line x1="-1.817714" y1="1.583246" x2="-1.796957" y2="1.695211" />
|
||||
<line x1="-1.774805" y1="1.574314" x2="-1.749161" y2="1.685262" />
|
||||
<line x1="-1.732328" y1="1.56351" x2="-1.701847" y2="1.673228" />
|
||||
<line x1="-1.690365" y1="1.550856" x2="-1.655106" y2="1.659133" />
|
||||
<line x1="-1.648997" y1="1.536374" x2="-1.609027" y2="1.643003" />
|
||||
<line x1="-1.608304" y1="1.520095" x2="-1.5637" y2="1.624869" />
|
||||
<line x1="-1.568363" y1="1.502047" x2="-1.519211" y2="1.604767" />
|
||||
<line x1="-1.529251" y1="1.482267" x2="-1.475645" y2="1.582734" />
|
||||
<line x1="-1.491043" y1="1.460792" x2="-1.433086" y2="1.558814" />
|
||||
<line x1="-1.453813" y1="1.437663" x2="-1.391617" y2="1.533051" />
|
||||
<line x1="-1.417632" y1="1.412926" x2="-1.351316" y2="1.505496" />
|
||||
<line x1="-1.382571" y1="1.386626" x2="-1.312262" y2="1.476202" />
|
||||
<line x1="-1.348695" y1="1.358816" x2="-1.274528" y2="1.445225" />
|
||||
<line x1="-1.31607" y1="1.329548" x2="-1.238188" y2="1.412624" />
|
||||
<line x1="-1.284759" y1="1.298878" x2="-1.203312" y2="1.378462" />
|
||||
<line x1="-1.254822" y1="1.266866" x2="-1.169966" y2="1.342804" />
|
||||
<line x1="-1.226317" y1="1.233572" x2="-1.138214" y2="1.30572" />
|
||||
<line x1="-1.199297" y1="1.199062" x2="-1.108119" y2="1.267279" />
|
||||
<line x1="-1.173816" y1="1.163401" x2="-1.079736" y2="1.227557" />
|
||||
<line x1="-1.149922" y1="1.126658" x2="-1.053121" y2="1.18663" />
|
||||
<line x1="-1.127662" y1="1.088902" x2="-1.028325" y2="1.144575" />
|
||||
<line x1="-1.107076" y1="1.050208" x2="-1.005396" y2="1.101475" />
|
||||
<line x1="-1.088206" y1="1.010649" x2="-0.984377" y2="1.057411" />
|
||||
<line x1="-1.071088" y1="0.970301" x2="-0.96531" y2="1.012468" />
|
||||
<line x1="-1.055754" y1="0.929241" x2="-0.94823" y2="0.966733" />
|
||||
<line x1="-1.042234" y1="0.88755" x2="-0.93317" y2="0.920294" />
|
||||
<line x1="-1.030554" y1="0.845305" x2="-0.92016" y2="0.873239" />
|
||||
<line x1="-1.020736" y1="0.80259" x2="-0.909224" y2="0.82566" />
|
||||
<line x1="-1.0128" y1="0.759485" x2="-0.900384" y2="0.777646" />
|
||||
<line x1="-1.006759" y1="0.716074" x2="-0.893656" y2="0.729292" />
|
||||
<line x1="-1.002627" y1="0.67244" x2="-0.889053" y2="0.680689" />
|
||||
<line x1="-1.000411" y1="0.628667" x2="-0.886584" y2="0.631932" />
|
||||
<line x1="-1.000115" y1="0.584839" x2="-0.886254" y2="0.583112" />
|
||||
<line x1="-1.00174" y1="0.54104" x2="-0.888064" y2="0.534326" />
|
||||
<line x1="-1.005282" y1="0.497354" x2="-0.89201" y2="0.485665" />
|
||||
<line x1="-1.010735" y1="0.453865" x2="-0.898084" y2="0.437224" />
|
||||
<line x1="-1.017988" y1="0.410638" x2="-1.008386" y2="0.408918" />
|
||||
<line x1="-1.02566" y1="0.367479" x2="-1.064104" y2="0.374138" />
|
||||
<line x1="-1.032681" y1="0.324211" x2="-1.120634" y2="0.337236" />
|
||||
<line x1="-1.038207" y1="0.280729" x2="-1.183067" y2="0.295583" />
|
||||
<line x1="-1.041271" y1="0.23701" x2="-1.255545" y2="0.244158" />
|
||||
<line x1="-1.040698" y1="0.193196" x2="-1.338464" y2="0.173854" />
|
||||
<line x1="-1.035095" y1="0.149753" x2="-1.419887" y2="0.07265" />
|
||||
<line x1="-1.02304" y1="0.107661" x2="-1.464479" y2="-0.061182" />
|
||||
<line x1="-1.003642" y1="0.068425" x2="-1.428659" y2="-0.194939" />
|
||||
<line x1="-0.977175" y1="0.033561" x2="-1.315635" y2="-0.276248" />
|
||||
<line x1="-0.945021" y1="0.003838" x2="-1.179066" y2="-0.292845" />
|
||||
<line x1="-0.908885" y1="-0.020922" x2="-1.059748" y2="-0.273224" />
|
||||
<line x1="-0.870163" y1="-0.04143" x2="-0.965653" y2="-0.244422" />
|
||||
<line x1="-0.829801" y1="-0.058503" x2="-0.890751" y2="-0.218457" />
|
||||
<line x1="-0.788391" y1="-0.072865" x2="-0.82802" y2="-0.198221" />
|
||||
<line x1="-0.746302" y1="-0.085102" x2="-0.772587" y2="-0.183283" />
|
||||
<line x1="-0.703763" y1="-0.095673" x2="-0.721503" y2="-0.17246" />
|
||||
<line x1="-0.660921" y1="-0.104943" x2="-0.673039" y2="-0.164638" />
|
||||
<line x1="-0.617871" y1="-0.113201" x2="-0.626183" y2="-0.158957" />
|
||||
<line x1="-0.57468" y1="-0.120684" x2="-0.580329" y2="-0.15479" />
|
||||
<line x1="-0.531392" y1="-0.127589" x2="-0.535105" y2="-0.151696" />
|
||||
<line x1="-0.48804" y1="-0.134086" x2="-0.490274" y2="-0.149362" />
|
||||
<line x1="-0.444651" y1="-0.140324" x2="-0.445677" y2="-0.147564" />
|
||||
<line x1="-0.401244" y1="-0.146439" x2="-0.401202" y2="-0.146139" />
|
||||
<line x1="-0.357838" y1="-0.152558" x2="-0.356759" y2="-0.144961" />
|
||||
<line x1="-0.314451" y1="-0.158806" x2="-0.312272" y2="-0.143927" />
|
||||
<line x1="-0.271101" y1="-0.165305" x2="-0.267661" y2="-0.142947" />
|
||||
<line x1="-0.22781" y1="-0.172182" x2="-0.222838" y2="-0.14193" />
|
||||
<line x1="-0.184604" y1="-0.17957" x2="-0.17769" y2="-0.140779" />
|
||||
<line x1="-0.141514" y1="-0.187614" x2="-0.13207" y2="-0.139385" />
|
||||
<line x1="-0.098585" y1="-0.196473" x2="-0.085772" y2="-0.137621" />
|
||||
<line x1="-0.055873" y1="-0.206328" x2="-0.038506" y2="-0.135351" />
|
||||
<line x1="-0.013455" y1="-0.217383" x2="0.010137" y2="-0.132443" />
|
||||
<line x1="0.028563" y1="-0.229876" x2="0.060734" y2="-0.128819" />
|
||||
<line x1="0.070035" y1="-0.244077" x2="0.114067" y2="-0.12457" />
|
||||
<line x1="0.110758" y1="-0.2603" x2="0.171124" y2="-0.120174" />
|
||||
<line x1="0.150456" y1="-0.278889" x2="0.232943" y2="-0.116908" />
|
||||
<line x1="0.188751" y1="-0.300212" x2="0.300099" y2="-0.117428" />
|
||||
<line x1="0.225157" y1="-0.324611" x2="0.371532" y2="-0.126302" />
|
||||
<line x1="0.259086" y1="-0.35234" x2="0.442771" y2="-0.149645" />
|
||||
<line x1="0.289921" y1="-0.383463" x2="0.504794" y2="-0.192691" />
|
||||
<line x1="0.317151" y1="-0.417775" x2="0.546121" y2="-0.255679" />
|
||||
<line x1="0.340552" y1="-0.454801" x2="0.558527" y2="-0.331965" />
|
||||
<line x1="0.360312" y1="-0.493891" x2="0.541215" y2="-0.411755" />
|
||||
<line x1="0.377052" y1="-0.53437" x2="0.498507" y2="-0.488309" />
|
||||
<line x1="0.391772" y1="-0.575629" x2="0.433621" y2="-0.56137" />
|
||||
<line x1="0.405802" y1="-0.617139" x2="0.389861" y2="-0.622559" />
|
||||
<line x1="0.420048" y1="-0.658592" x2="0.403219" y2="-0.664439" />
|
||||
<line x1="0.434578" y1="-0.699946" x2="0.416779" y2="-0.706272" />
|
||||
<line x1="0.449409" y1="-0.741194" x2="0.430545" y2="-0.748057" />
|
||||
<line x1="0.464558" y1="-0.782325" x2="0.444523" y2="-0.789796" />
|
||||
<line x1="0.480045" y1="-0.823331" x2="0.458717" y2="-0.831491" />
|
||||
<line x1="0.495893" y1="-0.864198" x2="0.473133" y2="-0.873145" />
|
||||
<line x1="0.512124" y1="-0.904915" x2="0.487772" y2="-0.914762" />
|
||||
<line x1="0.528767" y1="-0.945465" x2="0.502637" y2="-0.956352" />
|
||||
<line x1="0.545851" y1="-0.985831" x2="0.517727" y2="-0.997924" />
|
||||
<line x1="0.56341" y1="-1.025993" x2="0.533041" y2="-1.039496" />
|
||||
<line x1="0.581481" y1="-1.065926" x2="0.54857" y2="-1.08109" />
|
||||
<line x1="0.600109" y1="-1.105604" x2="0.564305" y2="-1.122738" />
|
||||
<line x1="0.619341" y1="-1.144992" x2="0.580227" y2="-1.164486" />
|
||||
<line x1="0.639233" y1="-1.18405" x2="0.596311" y2="-1.206399" />
|
||||
<line x1="0.659851" y1="-1.22273" x2="0.612521" y2="-1.24857" />
|
||||
<line x1="0.681269" y1="-1.260973" x2="0.628806" y2="-1.291131" />
|
||||
<line x1="0.703572" y1="-1.298706" x2="0.6451" y2="-1.334273" />
|
||||
<line x1="0.726864" y1="-1.335836" x2="0.66132" y2="-1.378277" />
|
||||
<line x1="0.751264" y1="-1.372248" x2="0.677369" y2="-1.423552" />
|
||||
<line x1="0.776912" y1="-1.40779" x2="0.693153" y2="-1.470708" />
|
||||
<line x1="0.803976" y1="-1.442265" x2="0.708623" y2="-1.520648" />
|
||||
<line x1="0.832651" y1="-1.47541" x2="0.723891" y2="-1.574706" />
|
||||
<line x1="0.863164" y1="-1.506869" x2="0.739494" y2="-1.634787" />
|
||||
<line x1="0.895764" y1="-1.536155" x2="0.756953" y2="-1.703401" />
|
||||
<line x1="0.930701" y1="-1.562599" x2="0.779856" y2="-1.783163" />
|
||||
<line x1="0.96817" y1="-1.585299" x2="0.815407" y2="-1.874679" />
|
||||
<line x1="1.008186" y1="-1.603102" x2="0.874899" y2="-1.971289" />
|
||||
<line x1="1.050405" y1="-1.614705" x2="0.968268" y2="-2.052096" />
|
||||
<line x1="1.093973" y1="-1.618986" x2="1.089835" y2="-2.085417" />
|
||||
<line x1="1.137617" y1="-1.615478" x2="1.211969" y2="-2.054151" />
|
||||
<line x1="1.180058" y1="-1.604618" x2="1.306741" y2="-1.974921" />
|
||||
<line x1="1.220411" y1="-1.587514" x2="1.367918" y2="-1.879332" />
|
||||
<line x1="1.258288" y1="-1.565474" x2="1.405068" y2="-1.788487" />
|
||||
<line x1="1.293666" y1="-1.539675" x2="1.429367" y2="-1.709258" />
|
||||
<line x1="1.326718" y1="-1.511042" x2="1.448021" y2="-1.64114" />
|
||||
<line x1="1.357691" y1="-1.480249" x2="1.464657" y2="-1.581556" />
|
||||
<line x1="1.386847" y1="-1.447776" x2="1.480836" y2="-1.527994" />
|
||||
<line x1="1.414422" y1="-1.41396" x2="1.497136" y2="-1.478537" />
|
||||
<line x1="1.440623" y1="-1.379043" x2="1.513704" y2="-1.431834" />
|
||||
<line x1="1.465625" y1="-1.3432" x2="1.530521" y2="-1.386966" />
|
||||
<line x1="1.489572" y1="-1.306567" x2="1.547511" y2="-1.343311" />
|
||||
<line x1="1.512581" y1="-1.269248" x2="1.564591" y2="-1.300448" />
|
||||
<line x1="1.534751" y1="-1.231331" x2="1.581683" y2="-1.258095" />
|
||||
<line x1="1.556162" y1="-1.192889" x2="1.598724" y2="-1.216057" />
|
||||
<line x1="1.576885" y1="-1.153986" x2="1.615664" y2="-1.174208" />
|
||||
<line x1="1.596975" y1="-1.114676" x2="1.632462" y2="-1.132459" />
|
||||
<line x1="1.616481" y1="-1.075011" x2="1.64909" y2="-1.090755" />
|
||||
<line x1="1.635447" y1="-1.035034" x2="1.665524" y2="-1.049059" />
|
||||
<line x1="1.653909" y1="-0.994785" x2="1.68175" y2="-1.00735" />
|
||||
<line x1="1.6719" y1="-0.9543" x2="1.697756" y2="-0.965616" />
|
||||
<line x1="1.689448" y1="-0.913611" x2="1.713535" y2="-0.923851" />
|
||||
<line x1="1.70658" y1="-0.872748" x2="1.729084" y2="-0.882054" />
|
||||
<line x1="1.723319" y1="-0.831734" x2="1.7444" y2="-0.840227" />
|
||||
<line x1="1.739687" y1="-0.790594" x2="1.759485" y2="-0.798374" />
|
||||
<line x1="1.755704" y1="-0.749347" x2="1.774341" y2="-0.756499" />
|
||||
<line x1="1.771388" y1="-0.708009" x2="1.78897" y2="-0.714605" />
|
||||
<line x1="1.786756" y1="-0.666597" x2="1.803377" y2="-0.672699" />
|
||||
<line x1="1.801824" y1="-0.625122" x2="1.817567" y2="-0.630783" />
|
||||
<line x1="1.816606" y1="-0.583597" x2="1.831545" y2="-0.588863" />
|
||||
<line x1="1.831116" y1="-0.54203" x2="1.845317" y2="-0.54694" />
|
||||
<line x1="1.845368" y1="-0.500429" x2="1.858888" y2="-0.505018" />
|
||||
<line x1="1.859373" y1="-0.4588" x2="1.872265" y2="-0.4631" />
|
||||
<line x1="1.873143" y1="-0.41715" x2="1.885454" y2="-0.421185" />
|
||||
<line x1="1.886689" y1="-0.375481" x2="1.89846" y2="-0.379277" />
|
||||
<line x1="1.90002" y1="-0.333798" x2="1.911291" y2="-0.337374" />
|
||||
<line x1="1.913147" y1="-0.292103" x2="1.923951" y2="-0.295478" />
|
||||
<line x1="1.926079" y1="-0.250398" x2="1.936447" y2="-0.253589" />
|
||||
<line x1="1.938823" y1="-0.208684" x2="1.948784" y2="-0.211705" />
|
||||
<line x1="1.951388" y1="-0.166962" x2="1.960967" y2="-0.169827" />
|
||||
<line x1="1.963781" y1="-0.125233" x2="1.973003" y2="-0.127953" />
|
||||
<line x1="1.97601" y1="-0.083496" x2="1.984896" y2="-0.086082" />
|
||||
<line x1="1.988081" y1="-0.041752" x2="1.996651" y2="-0.044214" />
|
||||
<line x1="2.0" y1="0.0" x2="2.008272" y2="-0.002347" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
22
docs/assets/coincident_ex.svg
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="1.0" y1="2.0" x2="2.0" y2="2.0" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<line x1="0.0" y1="0.0" x2="1.0" y2="2.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
38
docs/assets/complex_ex.svg
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="150.09mm" height="111.599794mm" viewBox="-14.0243 -24.0243 81.0486 60.263889" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.048600000000000004">
|
||||
<line x1="0.0" y1="0.0" x2="5.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="5.0" />
|
||||
<path d="M 5.0,0.0 C 4.861111,0.0 4.805556,0.083333 4.75,0.166667" />
|
||||
<path d="M 5.0,0.0 C 4.861111,0.0 4.805556,-0.083333 4.75,-0.166667" />
|
||||
<path d="M 0.0,5.0 C -0.0,4.861111 -0.083333,4.805556 -0.166667,4.75" />
|
||||
<path d="M 0.0,5.0 C -0.0,4.861111 0.083333,4.805556 0.166667,4.75" />
|
||||
<line x1="5.0" y1="-0.425" x2="5.557499" y2="0.425" />
|
||||
<line x1="5.583748" y1="-0.425" x2="5.028752" y2="0.425" />
|
||||
<line x1="0.425" y1="5.29375" x2="0.055001" y2="5.29375" />
|
||||
<line x1="-0.425" y1="5.0" x2="0.055001" y2="5.29375" />
|
||||
<line x1="0.055001" y1="5.29375" x2="-0.425" y2="5.59375" />
|
||||
<path d="M 18.243085,14.783252 A 19.0,19.0 0.0 0,1 38.0,24.0" />
|
||||
<line x1="38.0" y1="24.0" x2="62.0" y2="24.0" />
|
||||
<line x1="62.0" y1="24.0" x2="67.0" y2="19.0" />
|
||||
<line x1="67.0" y1="19.0" x2="67.0" y2="0.0" />
|
||||
<line x1="67.0" y1="0.0" x2="38.0" y2="-33.0" />
|
||||
<line x1="38.0" y1="-33.0" x2="32.788067" y2="-33.0" />
|
||||
<path d="M 26.012265,-18.264706 A 5.0,5.0 0.0 0,1 21.066626,-14.0" />
|
||||
<path d="M 26.012265,-18.264706 A 29.0,29.0 0.0 0,1 32.788067,-33.0" />
|
||||
<line x1="21.066626" y1="-14.0" x2="-7.0" y2="-14.0" />
|
||||
<line x1="-7.0" y1="-14.0" x2="-14.0" y2="-7.0" />
|
||||
<line x1="-14.0" y1="-7.0" x2="-14.0" y2="11.0" />
|
||||
<line x1="-14.0" y1="11.0" x2="-7.0" y2="18.0" />
|
||||
<line x1="-7.0" y1="18.0" x2="0.0" y2="18.0" />
|
||||
<line x1="0.0" y1="18.0" x2="18.243085" y2="14.783252" />
|
||||
<circle cx="0.0" cy="0.0" r="7.0" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.048600000000000004" id="dashed" stroke-dasharray="0.5832 0.8748">
|
||||
<line x1="0.0" y1="18.0" x2="49.240388" y2="9.317591" />
|
||||
<line x1="-14.0" y1="-14.0" x2="67.0" y2="-14.0" />
|
||||
<path d="M 25.69697,-14.0 A 29.0,29.0 0.0 0,1 36.056129,-36.215289" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
BIN
docs/assets/complex_sketch.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
26
docs/assets/enclosing_ex.svg
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="100.09mm" height="56.394348mm" viewBox="-2.752588 -2.240088 5.755175 3.242675" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005175">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 1.652902,-0.937829 A 6.0,6.0 0.0 0,1 -1.825521,-0.729422" />
|
||||
<path d="M 2.222098,0.975024 A 8.0,8.0 0.0 0,1 -2.252963,0.706052" />
|
||||
<path d="M -2.252963,0.706052 A 0.75,0.75 0.0 0,1 -1.825521,-0.729422" />
|
||||
<path d="M 1.652902,-0.937829 A 1.0,1.0 0.0 1,1 2.222098,0.975024" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005175" id="dashed" stroke-dasharray="0.0621 0.09315">
|
||||
<path d="M -1.869764,0.738606 A 0.75,0.75 0.0 1,1 -1.425467,-0.482091" />
|
||||
<path d="M 1.233956,-0.642788 A 1.0,1.0 0.0 1,1 1.65798,0.939693" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
24
docs/assets/intersect_ex.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="0.0" y1="0.0" x2="1.191794" y2="0.210145" />
|
||||
<line x1="0.0" y1="0.0" x2="0.306838" y2="1.740162" />
|
||||
<path d="M 1.191794,0.210145 A 1.8,1.2 90.0 0,1 0.306838,1.740162" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<path d="M 1.2,-0.0 A 1.8,1.2 90.0 0,1 0.0,1.8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
24
docs/assets/lines_angle_ex.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="45.099345mm" height="50.09mm" viewBox="-0.172403 -2.502403 2.408305 2.674806" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0048059999999999995">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="1.286788" y1="1.409576" x2="0.0" y2="2.310595" />
|
||||
<line x1="0.713212" y1="0.590424" x2="0.0" y2="1.08982" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0048059999999999995" id="dashed" stroke-dasharray="0.057672 0.086508">
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.5" />
|
||||
<circle cx="1.0" cy="1.0" r="0.5" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
26
docs/assets/lines_tan2_ex.svg
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.090004mm" height="28.523921mm" viewBox="-2.00381 -2.24131 4.24112 2.41512" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.007620298828125">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="-0.75" y1="0.031754" x2="1.125" y2="0.515877" />
|
||||
<line x1="-0.25" y1="1.661438" x2="0.625" y2="0.669281" />
|
||||
<line x1="-0.75" y1="1.968246" x2="1.125" y2="1.484123" />
|
||||
<line x1="-0.25" y1="0.338562" x2="0.625" y2="1.330719" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.007620298828125" id="dashed" stroke-dasharray="0.091444 0.137165">
|
||||
<circle cx="-1.0" cy="1.0" r="1.0" />
|
||||
<circle cx="1.0" cy="1.0" r="0.5" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
24
docs/assets/lines_tan_pnt_ex.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.090004mm" height="28.523921mm" viewBox="-2.00381 -2.24131 4.24112 2.41512" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.007620298828125">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="-0.5" y1="0.133975" x2="1.0" y2="1.0" />
|
||||
<line x1="-0.5" y1="1.866025" x2="1.0" y2="1.0" />
|
||||
<circle cx="1.0" cy="1.0" r="0.05" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.007620298828125" id="dashed" stroke-dasharray="0.091444 0.137165">
|
||||
<circle cx="-1.0" cy="1.0" r="1.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
22
docs/assets/offset_ex.svg
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="100.089987mm" height="61.29504mm" viewBox="-1.70177 -2.23927 3.937039 2.41104" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0035401494140625">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 1.5,0.0 L 1.5,0.8 A 0.2,0.2 0.0 0,1 1.3,1.0 L -1.3,1.0 A 0.2,0.2 0.0 0,1 -1.5,0.8 L -1.5,0.0 L -1.7,0.0 L -1.7,0.8 A 0.39999999999999997,0.39999999999999997 0.0 0,0 -1.3,1.2 L 1.3,1.2 A 0.39999999999999997,0.39999999999999997 0.0 0,0 1.7,0.8 L 1.7,0.0 L 1.5,0.0" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0035401494140625" id="dashed" stroke-dasharray="0.042482 0.063723">
|
||||
<path d="M 1.5,0.0 L 1.5,0.8 A 0.2,0.2 0.0 0,1 1.3,1.0 L -1.3,1.0 A 0.2,0.2 0.0 0,1 -1.5,0.8 L -1.5,0.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
22
docs/assets/perpendicular_ex.svg
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<line x1="1.06066" y1="1.06066" x2="1.767767" y2="1.767767" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<path d="M 1.5,0.0 A 1.5,1.5 0.0 0,1 1.06066,1.06066" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
21
docs/assets/pnt_center_ex.svg
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<circle cx="1.5" cy="1.5" r="0.05" />
|
||||
<circle cx="1.0" cy="1.0" r="0.05" />
|
||||
<circle cx="1.0" cy="1.0" r="0.7071067811865476" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
25
docs/assets/tan2_on_ex.svg
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="37.840214mm" height="50.090006mm" viewBox="-0.172865 -2.686291 2.40923 3.189156" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005730165832757586">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 1.51423,1.27059 A 0.8000000000000002,0.8000000000000002 0.0 0,1 1.8,1.883425" />
|
||||
<path d="M 1.8,1.883425 A 0.8000000000000002,0.8000000000000002 0.0 1,1 1.51423,1.27059" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005730165832757586" id="dashed" stroke-dasharray="0.068762 0.103143">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="1.678199" />
|
||||
<line x1="1.8" y1="0.0" x2="1.8" y2="2.0" />
|
||||
<line x1="1.0" y1="-0.5" x2="1.0" y2="2.5" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
26
docs/assets/tan2_rad_ex.svg
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 0.25,1.0 A 0.75,0.75 0.0 0,1 1.0,1.75" />
|
||||
<path d="M 1.0,1.75 A 0.75,0.75 0.0 0,1 1.75,1.0" />
|
||||
<path d="M 1.0,0.25 A 0.75,0.75 0.0 0,1 0.25,1.0" />
|
||||
<path d="M 1.75,1.0 A 0.75,0.75 0.0 0,1 1.0,0.25" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<line x1="0.0" y1="1.0" x2="2.0" y2="1.0" />
|
||||
<line x1="1.0" y1="0.0" x2="1.0" y2="2.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
24
docs/assets/tan3_ex.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 0.75519,1.308027 A 0.26632062806233736,0.26632062806233736 0.0 0,1 1.157018,0.970853" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<line x1="0.0" y1="0.0" x2="0.9" y2="1.558846" />
|
||||
<line x1="0.0" y1="0.0" x2="1.37888" y2="1.157018" />
|
||||
<path d="M 1.8,0.0 A 1.8,1.8 0.0 0,1 0.0,1.8" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
24
docs/assets/tan_rad_on_ex.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="40.148317mm" height="50.09mm" viewBox="-0.1727 -2.5027 2.408899 3.0054" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005399999999999999">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<circle cx="1.0" cy="0.186396" r="0.5" />
|
||||
<circle cx="1.0" cy="1.491803" r="0.5" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.005399999999999999" id="dashed" stroke-dasharray="0.0648 0.0972">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="1.678199" />
|
||||
<line x1="1.0" y1="-0.5" x2="1.0" y2="2.5" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
19
docs/assets/tangent_circles.svg
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="100.09mm" height="69.188791mm" viewBox="-17.0153 -11.762094 34.0306 23.524189" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.030599999999999995">
|
||||
<circle cx="0.0" cy="3.872983" r="2.0" />
|
||||
<circle cx="0.0" cy="-3.872983" r="2.0" />
|
||||
<circle cx="-2.857143" cy="6.843737" r="2.0" />
|
||||
<circle cx="-2.857143" cy="-6.843737" r="2.0" />
|
||||
<circle cx="2.857143" cy="6.843737" r="2.0" />
|
||||
<circle cx="2.857143" cy="-6.843737" r="2.0" />
|
||||
<circle cx="0.0" cy="9.746794" r="2.0" />
|
||||
<circle cx="0.0" cy="-9.746794" r="2.0" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.030599999999999995" id="dashed" stroke-dasharray="0.3672 0.5508">
|
||||
<circle cx="-7.0" cy="0.0" r="10.0" />
|
||||
<circle cx="7.0" cy="0.0" r="10.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 960 B |
22
docs/assets/tangent_ex.svg
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<svg width="50.006916mm" height="50.08999mm" viewBox="-0.172167 -2.239667 2.407833 2.411833" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="scale(1,-1)" stroke-linecap="round">
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335">
|
||||
<line x1="0.0" y1="0.0" x2="2.0" y2="0.0" />
|
||||
<line x1="0.0" y1="0.0" x2="0.0" y2="2.0" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,0.033333 1.9,0.066667" />
|
||||
<path d="M 2.0,0.0 C 1.944444,0.0 1.922222,-0.033333 1.9,-0.066667" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 -0.033333,1.922222 -0.066667,1.9" />
|
||||
<path d="M 0.0,2.0 C -0.0,1.944444 0.033333,1.922222 0.066667,1.9" />
|
||||
<line x1="2.0" y1="-0.17" x2="2.223" y2="0.17" />
|
||||
<line x1="2.233499" y1="-0.17" x2="2.011501" y2="0.17" />
|
||||
<line x1="0.17" y1="2.1175" x2="0.022" y2="2.1175" />
|
||||
<line x1="-0.17" y1="2.0" x2="0.022" y2="2.1175" />
|
||||
<line x1="0.022" y1="2.1175" x2="-0.17" y2="2.2375" />
|
||||
<path d="M 1.0,1.0 A 1.000000000000001,1.000000000000001 -45.0 0,1 1.199201,2.129725" />
|
||||
</g>
|
||||
<g fill="none" stroke="rgb(0,0,0)" stroke-width="0.0043335" id="dashed" stroke-dasharray="0.052002 0.078003">
|
||||
<line x1="0.0" y1="0.0" x2="1.0" y2="1.0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
773
docs/tutorial_constraints.rst
Normal file
|
|
@ -0,0 +1,773 @@
|
|||
########################
|
||||
Drawing with Constraints
|
||||
########################
|
||||
|
||||
************
|
||||
Introduction
|
||||
************
|
||||
|
||||
CAD constraints are geometric and dimensional rules that define how sketch or assembly entities
|
||||
relate to one another. They control degrees of freedom (for example, parallel,
|
||||
perpendicular, tangent, coincident, distance, or angle), so edits preserve design intent instead
|
||||
of introducing unintended shape changes. This is the foundation of parametric
|
||||
modeling: behavior is driven by explicit relationships, not fixed manually drawn geometry.
|
||||
This section only addresses sketch constraints.
|
||||
|
||||
In graphical CAD systems, sketching is usually a two-step workflow: first draw approximate
|
||||
geometry, then add dimensions and constraints so a global solver can infer exact positions.
|
||||
That model works well for interactive drawing, but it also encourages tightly coupled
|
||||
constraint networks that can become difficult to predict and maintain as a design evolves.
|
||||
It is also typically strongest for lines and circular arcs, with more limited and less
|
||||
robust behavior for ellipses, splines, and other higher-order curves.
|
||||
|
||||
In build123d, the primary workflow is different. Geometry is defined precisely at creation
|
||||
time using coordinates, parameters, and explicit geometric relationships in code. Instead of
|
||||
building a large interdependent constraint graph and asking a global solver to resolve it,
|
||||
you express intent directly: mirror about a plane, construct tangent features, derive points
|
||||
and frames from existing topology, and compose operations deterministically.
|
||||
|
||||
This does not eliminate constrained construction; it scopes it. build123d provides targeted
|
||||
geometric local solvers for common high-value problems, including objects such as
|
||||
:class:`~objects_curve.BlendCurve`, :class:`~objects_curve.ConstrainedLines`,
|
||||
:class:`~objects_curve.ConstrainedArcs`, :class:`~objects_curve.IntersectingLine`, and
|
||||
:class:`~objects_sketch.Triangle`.
|
||||
It also provides geometric operations that enforce clear relationships
|
||||
directly, such as :class:`~operations_sketch.make_hull`, :class:`~operations_generic.mirror`,
|
||||
and :class:`~operations_generic.offset`. Together, these tools solve specific
|
||||
constraint patterns while keeping model behavior explicit, deterministic, and readable in
|
||||
code.
|
||||
|
||||
The result is a practical hybrid approach: precise programmatic modeling by default, with
|
||||
specialized constrained constructors when they provide clear leverage. For most production
|
||||
parts, this yields robust, maintainable sketches without the overhead and fragility of a
|
||||
general-purpose sketch solver.
|
||||
|
||||
****************
|
||||
Constraint Types
|
||||
****************
|
||||
|
||||
build123d supports several practical forms of constrained construction. Rather than relying on
|
||||
a single global sketch solver, it provides targeted tools that enforce specific geometric
|
||||
relationships directly and predictably.
|
||||
|
||||
Analytical Constraints
|
||||
======================
|
||||
|
||||
:class:`~objects_sketch.Triangle`
|
||||
Constructs a triangle from any three parameters (side lengths and/or interior angles)
|
||||
and solves for the others. Angle naming follows standard convention: side ``a`` is opposite
|
||||
angle ``A``, side ``b`` is opposite angle ``B``, and side ``c`` is opposite angle ``C``.
|
||||
|
||||
Continuity Constraints
|
||||
======================
|
||||
|
||||
:class:`~objects_curve.BlendCurve`
|
||||
Creates a smooth Bézier transition between two existing edges.
|
||||
|
||||
In this context, *continuity* describes how smoothly the new blend joins the input edges
|
||||
at each endpoint:
|
||||
|
||||
- C0 (positional continuity): endpoints meet, but direction may kink.
|
||||
- C1 (tangent continuity): endpoints and tangent directions match, giving a visually smooth join with no corner.
|
||||
- C2 (curvature continuity): endpoints, tangents, and curvature trend match, reducing curvature jumps and producing a smoother fairing.
|
||||
|
||||
:class:`~objects_curve.BlendCurve` builds a Bézier curve that satisfies these endpoint constraints:
|
||||
|
||||
- cubic Bézier for C1 blending (position + first derivative),
|
||||
- quintic Bézier for C2 blending (position + first and second derivatives).
|
||||
|
||||
The derivatives are sampled from the two source edges at the selected connection points,
|
||||
then converted into Bézier control points that enforce the requested continuity.
|
||||
Optional tangent scaling factors let you tune how strongly the blend departs from each
|
||||
source edge, which adjusts perceived tension and transition shape without changing the
|
||||
endpoint constraints.
|
||||
|
||||
Geometric Relationship Constraints
|
||||
==================================
|
||||
|
||||
``@`` and ``%`` operators
|
||||
Use ``@`` (position-at) and ``%`` (tangent-at) to construct geometry relative to existing
|
||||
geometry. Typical uses include starting a new edge at an exact point on another edge,
|
||||
or aligning a new edge direction to a sampled tangent.
|
||||
|
||||
:class:`~operations_generic.mirror`
|
||||
Enforces symmetry by reflecting geometry about a plane, producing mirrored entities with
|
||||
exact geometric correspondence to the source.
|
||||
|
||||
Intersection Constraints
|
||||
========================
|
||||
|
||||
:class:`~objects_curve.IntersectingLine`
|
||||
Constructs a line from a point/direction definition and an intersection condition against
|
||||
another line-like reference, ensuring the resulting geometry satisfies the intersection
|
||||
requirement.
|
||||
|
||||
|
||||
Offset / Equidistance Constraints
|
||||
=================================
|
||||
|
||||
:class:`~operations_generic.offset`
|
||||
Creates geometry at a constant normal distance from a source edge or wire.
|
||||
|
||||
This enforces an equidistance relationship commonly used for wall thickness, clearances,
|
||||
toolpaths, and parallel profile construction. Join behavior (for example at corners) can
|
||||
be controlled to match the design intent.
|
||||
|
||||
Tangency Constraints
|
||||
====================
|
||||
|
||||
:class:`~objects_curve.ConstrainedArcs` and :class:`~objects_curve.ConstrainedLines`
|
||||
Provide local constrained solving for 2D
|
||||
line-and-circle constructions. These APIs solve common geometric construction problems
|
||||
from explicit numeric and geometric constraints relative to existing curves.
|
||||
|
||||
Supported constraint patterns include:
|
||||
|
||||
- circle with specified radius,
|
||||
- line at a specified angle to another line,
|
||||
- tangency of a line or circle to a reference curve,
|
||||
- line or circle passing through a point,
|
||||
- circle center constrained to a point or to lie on a curve.
|
||||
|
||||
For example, you can construct a circle with a given radius whose center lies on a
|
||||
specified line and which is tangent to another circle. This style of targeted solving
|
||||
covers high-value sketch workflows while keeping branch selection explicit and
|
||||
deterministic in code.
|
||||
|
||||
Multiple Solutions and Qualification
|
||||
------------------------------------
|
||||
|
||||
Tangency construction is typically multi-solution. A single problem statement can produce
|
||||
several valid geometric branches depending on where the solution lies relative to the
|
||||
reference entities.
|
||||
|
||||
For example, a circle of fixed radius tangent to two secant circles can produce up to
|
||||
eight valid solutions as shown below. This is expected behavior, not an error.
|
||||
|
||||
.. figure:: ./assets/tangent_circles.svg
|
||||
:align: center
|
||||
|
||||
To reduce ambiguity, tangency constraints support **qualification** of relative position:
|
||||
|
||||
- ``Tangency.ENCLOSING``: the solution must enclose the argument.
|
||||
- ``Tangency.ENCLOSED``: the solution must be enclosed by the argument.
|
||||
- ``Tangency.OUTSIDE``: the solution and argument must be external to each other.
|
||||
- ``Tangency.UNQUALIFIED``: no positional filtering; all valid branches are returned.
|
||||
|
||||
These qualifiers are intuitive for circles (inside/outside). For general oriented curves,
|
||||
interior is defined as the left-hand side of the curve with respect to its orientation.
|
||||
|
||||
Even with qualification, more than one solution may remain. In that case, use a
|
||||
``selector`` to choose deterministic outputs.
|
||||
|
||||
Selecting results
|
||||
-----------------
|
||||
|
||||
In Algebra mode, select from returned edges after construction:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
arcs = ConstrainedArcs(..., sagitta=Sagitta.BOTH)
|
||||
chosen = arcs.edges().sort_by(Edge.length)[0]
|
||||
|
||||
In Builder mode, prefer the constructor ``selector`` argument so only desired branches
|
||||
are added to the active context:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine():
|
||||
ConstrainedArcs(
|
||||
...,
|
||||
selector=lambda edges: edges.sort_by_distance((0, 0))[0],
|
||||
)
|
||||
|
||||
This combination of qualification + selection gives robust, explicit control over
|
||||
tangency branch choice.
|
||||
|
||||
******************
|
||||
Practical Examples
|
||||
******************
|
||||
|
||||
The following examples show how each constraint type is used in production-style sketching.
|
||||
Each example is intentionally small, with construction geometry kept visible in code so the
|
||||
relationship logic is explicit and reusable.
|
||||
|
||||
Analytical Constraints
|
||||
======================
|
||||
|
||||
build123d includes a built-in :class:`~objects_sketch.Triangle` object that has an internal solver such that one can
|
||||
specify any three parameters of a triangle and solve for the others. For example:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
>>> isosceles = Triangle(a=30, b=30, C=60)
|
||||
>>> isosceles.c
|
||||
29.999999999999996
|
||||
>>> isosceles.A
|
||||
60.00000000000001
|
||||
>>> isosceles.B
|
||||
60.00000000000001
|
||||
>>> isosceles.vertex_A
|
||||
Vertex(-1.7763568394002505e-15, 17.32050807568877, 0.0)
|
||||
|
||||
In this example, side lengths ``a`` and ``b`` with included angle ``C`` are provided.
|
||||
The object then computes the remaining side, angles, and vertices. This is useful when a
|
||||
design intent is naturally expressed as triangle dimensions instead of explicit coordinates.
|
||||
|
||||
One can easily use external solvers, say the symbolic solver ``sympy``, within your build123d code
|
||||
as follows:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
from math import sin, cos, tan, radians
|
||||
from build123d import *
|
||||
from ocp_vscode import *
|
||||
import sympy
|
||||
|
||||
# This problem uses the sympy symbolic math solver
|
||||
|
||||
# Define the symbols for the unknowns
|
||||
# - the center of the radius 30 arc (x30, y30)
|
||||
# - the center of the radius 66 arc (x66, y66)
|
||||
# - end of the 8° line (l8x, l8y)
|
||||
# - the point with the radius 30 and 66 arc meet i30_66
|
||||
# - the start of the horizontal line lh
|
||||
y30, x66, xl8, yl8 = sympy.symbols("y30 x66 xl8 yl8")
|
||||
x30 = 77 - 55 / 2
|
||||
y66 = 66 + 32
|
||||
|
||||
# There are 4 unknowns so we need 4 equations
|
||||
equations = [
|
||||
(x66 - x30) ** 2 + (y66 - y30) ** 2 - (66 + 30) ** 2, # distance between centers
|
||||
xl8 - (x30 + 30 * sin(radians(8))), # 8 degree slope
|
||||
yl8 - (y30 + 30 * cos(radians(8))), # 8 degree slope
|
||||
(yl8 - 50) / (55 / 2 - xl8) - tan(radians(8)), # 8 degree slope
|
||||
]
|
||||
# There are two solutions but we want the 2nd one
|
||||
solution = {k: float(v) for k,v in sympy.solve(equations, dict=True)[1].items()}
|
||||
|
||||
# Create the critical points
|
||||
c30 = Vector(x30, solution[y30])
|
||||
c66 = Vector(solution[x66], y66)
|
||||
l8 = Vector(solution[xl8], solution[yl8])
|
||||
|
||||
...
|
||||
|
||||
This pattern is useful when the governing relationships are algebraic but awkward to
|
||||
construct directly with primitives. Solve unknown parameters first, then feed the solved
|
||||
values into standard build123d geometry construction.
|
||||
|
||||
|
||||
Continuity Constraints
|
||||
======================
|
||||
|
||||
One may want to join two curves with a third curve such that the connector satisfies a
|
||||
given continuity where they meet as shown here where a semi-circle (on the left) is joined
|
||||
to a spline (on the right).
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
m1 = CenterArc((-2, 0.6), 1, -10, 200).reversed()
|
||||
m2 = Spline((0.4, -0.6), (1, -1.6), (2, 0))
|
||||
connector = BlendCurve(m1, m2, tangent_scalars=(2, 1), continuity=ContinuityLevel.C2)
|
||||
comb = Curve(Wire([m1, connector, m2]).curvature_comb(200))
|
||||
|
||||
.. figure:: ./assets/blend_curve_ex.svg
|
||||
:align: center
|
||||
|
||||
The key call is ``BlendCurve(..., continuity=ContinuityLevel.C2)``. ``C2`` continuity
|
||||
matches endpoint curvature trend in addition to position and tangent, which reduces visible
|
||||
fairness breaks at joins. ``tangent_scalars`` controls how strongly the connector departs
|
||||
from each source curve.
|
||||
|
||||
``curvature_comb`` is used here as a diagnostic. The normal "comb" lines represent local
|
||||
curvature magnitude; smoother transitions produce gradual comb variation rather than abrupt
|
||||
spikes.
|
||||
|
||||
Geometric Relationship Constraints
|
||||
==================================
|
||||
|
||||
Coincident
|
||||
----------
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as coincident_ex:
|
||||
l1 = Line((0, 0), (1, 2))
|
||||
l2 = Line(l1 @ 1, l1 @ 1 + (1, 0))
|
||||
|
||||
.. figure:: ./assets/coincident_ex.svg
|
||||
:align: center
|
||||
|
||||
The second line starts at ``l1 @ 1`` (the end of ``l1``), creating an exact coincident
|
||||
relationship without a separate constraint object.
|
||||
|
||||
Tangent
|
||||
-------
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as tangent_ex:
|
||||
l1 = Line((0, 0), (1, 1))
|
||||
l2 = JernArc(start=l1 @ 1, tangent=l1 % 1, radius=1, arc_size=70)
|
||||
|
||||
.. figure:: ./assets/tangent_ex.svg
|
||||
:align: center
|
||||
|
||||
The arc starts at the line endpoint and uses ``l1 % 1`` as its initial tangent direction.
|
||||
This is a direct tangent construction: continuity is encoded in the creation call.
|
||||
|
||||
Perpendicular
|
||||
-------------
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as perpendicular_ex:
|
||||
l1 = CenterArc((0, 0), 1.5, 0, 45)
|
||||
l2 = PolarLine(
|
||||
start=l1 @ 1, length=1, direction=l1.tangent_at(1).rotate(Axis.Z, -90)
|
||||
)
|
||||
|
||||
.. figure:: ./assets/perpendicular_ex.svg
|
||||
:align: center
|
||||
|
||||
The direction vector is built from ``l1.tangent_at(1)`` rotated by 90 degrees, giving an
|
||||
explicit perpendicular relationship relative to curve orientation.
|
||||
|
||||
Intersection Constraints
|
||||
========================
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as intersect_ex:
|
||||
c1 = EllipticalCenterArc((0, 0), 1.2, 1.8, 0, 90, mode=Mode.PRIVATE)
|
||||
l1 = IntersectingLine(
|
||||
start=(0, 0), direction=Vector(1, 0).rotate(Axis.Z, 10), other=c1
|
||||
)
|
||||
l2 = IntersectingLine(
|
||||
start=(0, 0), direction=Vector(1, 0).rotate(Axis.Z, 80), other=c1
|
||||
)
|
||||
l3 = add(c1.trim(l1 @ 1, l2 @ 1))
|
||||
|
||||
.. figure:: ./assets/intersect_ex.svg
|
||||
:align: center
|
||||
|
||||
:class:`~objects_curve.IntersectingLine` creates each line from a point and direction, then trims it to the
|
||||
intersection with the ellipse. This is often cleaner than creating long helper lines and
|
||||
manually trimming afterward.
|
||||
|
||||
Offset / Equidistance Constraints
|
||||
=================================
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
inside = FilletPolyline((1.5, 0), (1.5, 1), (-1.5, 1), (-1.5, 0), radius=0.2)
|
||||
perimeter = offset(inside, amount=0.2, side=Side.RIGHT)
|
||||
|
||||
|
||||
.. figure:: ./assets/offset_ex.svg
|
||||
:align: center
|
||||
|
||||
:class:`~operations_generic.offset` preserves the source profile shape while enforcing constant wall thickness.
|
||||
This is a common pattern for clearances, shells, and manufacturing margins.
|
||||
|
||||
Tangency Constraints
|
||||
====================
|
||||
|
||||
Both :class:`~objects_curve.ConstrainedArcs` and :class:`~objects_curve.ConstrainedLines`
|
||||
return a :class:`~topology.Curve` containing one or more :class:`~topology.Edge` objects.
|
||||
|
||||
These constructors solve tangent/contact problems from mixed numeric and geometric inputs.
|
||||
Because tangency is often ambiguous, multiple valid branches are expected.
|
||||
|
||||
|
||||
Multiple solutions
|
||||
------------------
|
||||
|
||||
Constraint systems often yield multiple valid results. The ``selector`` callback is the
|
||||
main tool for choosing the subset to keep.
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
# Keep all solutions
|
||||
ConstrainedArcs(..., selector=lambda arcs: arcs)
|
||||
|
||||
# Keep first
|
||||
ConstrainedArcs(..., selector=lambda arcs: arcs[0])
|
||||
|
||||
# Keep shortest
|
||||
ConstrainedArcs(..., selector=lambda arcs: arcs.sort_by(Edge.length)[0])
|
||||
|
||||
In Builder mode, omitting ``selector`` can add all solutions to context, which is often
|
||||
not what you want for production sketches.
|
||||
|
||||
Tangency qualifiers
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Tangency qualifiers come from OCCT and are exposed as ``Tangency``:
|
||||
|
||||
- ``Tangency.UNQUALIFIED``:
|
||||
no side preference (OCCT ``Unqualified``).
|
||||
- ``Tangency.OUTSIDE``:
|
||||
tangent on the exterior side of the target (OCCT ``Outside``).
|
||||
- ``Tangency.ENCLOSING``:
|
||||
solution encloses/includes the target (OCCT ``Enclosing``).
|
||||
- ``Tangency.ENCLOSED``:
|
||||
solution is enclosed/included by the target (OCCT ``Enclosed``).
|
||||
|
||||
These semantics are most visible for curve-vs-curve constraints (for example circle
|
||||
to circle, line to circle). In many practical cases, ``UNQUALIFIED`` is a good default
|
||||
followed by filtering via ``selector``.
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as egg_plant:
|
||||
# Construction Geometry
|
||||
c1 = CenterArc((-2, 0), 0.75, 80, 240, mode=Mode.PRIVATE)
|
||||
c2 = CenterArc((2, 0), 1, 220, 250, mode=Mode.PRIVATE)
|
||||
|
||||
# egg_plant perimeter
|
||||
l1 = ConstrainedArcs((c2, Tangency.OUTSIDE), (c1, Tangency.OUTSIDE), radius=6)
|
||||
l2 = ConstrainedArcs(
|
||||
(c2, Tangency.ENCLOSING),
|
||||
(c1, Tangency.ENCLOSING),
|
||||
radius=8,
|
||||
selector=lambda a: a.sort_by(Axis.Y)[-1],
|
||||
)
|
||||
l3 = add(c1.trim(l1 @ 1, l2 @ 1))
|
||||
l4 = add(c2.trim(l1 @ 0, l2 @ 0))
|
||||
|
||||
.. figure:: ./assets/enclosing_ex.svg
|
||||
:align: center
|
||||
|
||||
In the "egg-plant" example, ``Tangency.OUTSIDE`` and ``Tangency.ENCLOSING`` reduce the
|
||||
candidate branches to the intended outer profile. The selector on ``l2`` then resolves
|
||||
the remaining ambiguity deterministically by choosing the highest branch in ``Y``.
|
||||
|
||||
OCCT defines exterior/interior using orientation:
|
||||
|
||||
- Circle: exterior is on the right side when traversing by its orientation
|
||||
(interior/material is on the left side).
|
||||
- Line/open curve: interior is the left side with respect to traversal direction,
|
||||
exterior is the opposite side.
|
||||
|
||||
Because of this, changing an input edge direction can change which branches satisfy
|
||||
``OUTSIDE``/``ENCLOSING``/``ENCLOSED``.
|
||||
|
||||
If qualifier behavior appears inverted, inspect input edge orientation first.
|
||||
|
||||
ConstrainedArcs
|
||||
---------------
|
||||
|
||||
Overview
|
||||
~~~~~~~~
|
||||
|
||||
:class:`~objects_curve.ConstrainedArcs` supports several signature families for planar circular arcs:
|
||||
|
||||
1. Two tangency/contact objects + fixed radius
|
||||
2. Two tangency/contact objects + center constrained on a locus
|
||||
3. Three tangency/contact objects
|
||||
4. One tangency/contact object + fixed center
|
||||
5. One tangency/contact object + fixed radius + center constrained on a locus
|
||||
|
||||
``sagitta`` selects short/long/both arc branches:
|
||||
|
||||
- ``Sagitta.SHORT``
|
||||
- ``Sagitta.LONG``
|
||||
- ``Sagitta.BOTH``
|
||||
|
||||
In practice, use qualifiers and ``sagitta`` to reduce branch count, then finalize with
|
||||
``selector`` for deterministic output.
|
||||
|
||||
Signature A: Two constraints + ``radius``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedArcs(
|
||||
tangency_one,
|
||||
tangency_two,
|
||||
radius=...,
|
||||
sagitta=Sagitta.SHORT,
|
||||
selector=lambda arcs: arcs,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/tan2_rad_ex.svg
|
||||
:align: center
|
||||
|
||||
Use when radius is known and arc must satisfy two contact/tangency conditions.
|
||||
|
||||
Signature B: Two constraints + ``center_on``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedArcs(
|
||||
tangency_one,
|
||||
tangency_two,
|
||||
center_on=Axis(...), # or Edge
|
||||
sagitta=Sagitta.SHORT,
|
||||
selector=lambda arcs: arcs,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/tan2_on_ex.svg
|
||||
:align: center
|
||||
|
||||
Use when center must lie on a specific line/curve rather than radius being fixed.
|
||||
|
||||
Signature C: Three constraints
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedArcs(
|
||||
tangency_one,
|
||||
tangency_two,
|
||||
tangency_three,
|
||||
sagitta=Sagitta.BOTH,
|
||||
selector=lambda arcs: arcs,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/tan3_ex.svg
|
||||
:align: center
|
||||
|
||||
Use for "arc tangent/contact to three entities". This can produce several branches;
|
||||
always consider using ``selector``.
|
||||
|
||||
Signature D: One constraint + fixed ``center``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedArcs(
|
||||
tangency_one,
|
||||
center=(x, y),
|
||||
selector=lambda arcs: arcs[0],
|
||||
)
|
||||
|
||||
.. figure:: ./assets/pnt_center_ex.svg
|
||||
:align: center
|
||||
|
||||
Useful for "center-known" constructions.
|
||||
|
||||
Signature E: One constraint + radius + ``center_on``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedArcs(
|
||||
tangency_one,
|
||||
radius=...,
|
||||
center_on=some_edge,
|
||||
selector=lambda arcs: arcs,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/tan_rad_on_ex.svg
|
||||
:align: center
|
||||
|
||||
Useful for guided-center constructions with fixed radius.
|
||||
|
||||
Allowed constraint objects
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
For arc constraints, accepted objects include:
|
||||
|
||||
- :class:`~topology.Edge`
|
||||
- :class:`~geometry.Axis`
|
||||
- :class:`~geometry.Vertex` / :class:`~geometry.VectorLike` point
|
||||
- optional qualifier wrapper: ``(object, Tangency.XXX)``
|
||||
|
||||
ConstrainedLines
|
||||
----------------
|
||||
|
||||
Overview
|
||||
~~~~~~~~
|
||||
|
||||
:class:`~objects_curve.ConstrainedLines` supports these signature families:
|
||||
|
||||
1. Tangent/contact to two objects
|
||||
2. Tangent/contact to one object and passing through a fixed point
|
||||
3. Tangent/contact to one object with fixed orientation (``angle`` or ``direction``)
|
||||
|
||||
Signature A: Two constraints
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedLines(
|
||||
tangency_one,
|
||||
tangency_two,
|
||||
selector=lambda lines: lines,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/lines_tan2_ex.svg
|
||||
:align: center
|
||||
|
||||
|
||||
Signature B: One constraint + through point
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedLines(
|
||||
tangency_one,
|
||||
(x, y), # through point
|
||||
selector=lambda lines: lines,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/lines_tan_pnt_ex.svg
|
||||
:align: center
|
||||
|
||||
Signature C: One constraint + fixed orientation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
ConstrainedLines(
|
||||
tangency_one,
|
||||
Axis.Y,
|
||||
angle=30, # OR direction=(dx, dy)
|
||||
selector=lambda lines: lines,
|
||||
)
|
||||
|
||||
.. figure:: ./assets/lines_angle_ex.svg
|
||||
:align: center
|
||||
|
||||
Exactly one of ``angle`` or ``direction`` should be provided.
|
||||
|
||||
For all signatures, qualifiers can be attached to tangency inputs when side selection
|
||||
must be controlled.
|
||||
|
||||
Builder vs Algebra mode
|
||||
-----------------------
|
||||
|
||||
Algebra mode
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Use direct assignment and post-selection:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
arcs = ConstrainedArcs(..., sagitta=Sagitta.BOTH)
|
||||
chosen = arcs.edges().sort_by(Edge.length)[0]
|
||||
|
||||
Builder mode
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Prefer selecting inside the call to avoid adding unwanted candidates to context:
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
with BuildLine() as bl:
|
||||
ConstrainedArcs(
|
||||
...,
|
||||
sagitta=Sagitta.BOTH,
|
||||
selector=lambda arcs: arcs.sort_by(Edge.length)[0],
|
||||
)
|
||||
|
||||
Selection recipes
|
||||
-----------------
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
# Nearest to point
|
||||
selector=lambda edges: edges.sort_by_distance((0, 0))[0]
|
||||
|
||||
# Longest
|
||||
selector=lambda edges: edges.sort_by(Edge.length)[-1]
|
||||
|
||||
# Right most
|
||||
selector=lambda edges: edges.sort_by(Axis.X)[-1]
|
||||
|
||||
# Keep two branches
|
||||
selector=lambda edges: edges[:2]
|
||||
|
||||
Prefer geometric selection criteria (distance, axis ordering, length) over positional
|
||||
indexing when upstream geometry may change.
|
||||
|
||||
***********************
|
||||
Complex Drawing Example
|
||||
***********************
|
||||
|
||||
This example pulls many of the techniques described above into a single example
|
||||
where the following full constrained, complex sketch is converted into build123d code.
|
||||
|
||||
.. figure:: ./assets/complex_sketch.png
|
||||
:align: center
|
||||
|
||||
When working with a drawing such as this one, the ``ImageFace`` functionality of the
|
||||
`ocp-vscode <https://github.com/bernhard-42/vscode-ocp-cad-viewer>`_ viewer is very handy as
|
||||
it allows the image to be used as a visual guide when creating the sketch.
|
||||
|
||||
Within the following code the following conventions are used:
|
||||
|
||||
- construction geometry is labeled with a ``c_...``
|
||||
- arcs are labeled with a ``a<radius>``
|
||||
- lines and polylines are labeled with a ``l...``
|
||||
|
||||
The code starts immediately above the origin (arbitrarily set to the origin of the circle)
|
||||
where a straight line 10° off the x-axis originates. The code then walks around the diagram
|
||||
clockwise creating the perimeter of the object.
|
||||
|
||||
.. code-block:: build123d
|
||||
|
||||
image = ImageFace(
|
||||
"complex_sketch.png",
|
||||
scale=29 / 264,
|
||||
origin_pixels=(297, 390),
|
||||
location=Location((0, 0, -0.1)),
|
||||
)
|
||||
|
||||
with BuildSketch() as sketch:
|
||||
with BuildLine() as perimeter:
|
||||
c_l1 = PolarLine((0, 32 - 14), 50, -10, mode=Mode.PRIVATE)
|
||||
a19 = ConstrainedArcs(c_l1, (-14 + 81 - 29, -14 - 19 + 57), radius=19)
|
||||
l2 = Polyline(a19 @ 1, a19 @ 1 + (29 - 5, 0), a19 @ 1 + (29, -5), (-14 + 81, 0))
|
||||
l3 = Line(l2 @ 1, (-14 + 81 - 29, (-14 - 19)))
|
||||
c_l4 = Line((-14, -14), (-14 + 81, -14), mode=Mode.PRIVATE)
|
||||
c_a29_arc_center = l3.intersect(c_l4)[0]
|
||||
c_a29 = CenterArc(c_a29_arc_center, 29, 180, 50, mode=Mode.PRIVATE)
|
||||
l5 = IntersectingLine(l3 @ 1, (-1, 0), c_a29)
|
||||
a5 = ConstrainedArcs(
|
||||
c_a29, c_l4, radius=5, selector=lambda a: a.sort_by(Axis.X)[0]
|
||||
)
|
||||
a29 = add(c_a29.trim(l5 @ 1, a5 @ 0))
|
||||
l6 = Polyline(
|
||||
a5 @ 1,
|
||||
(-14 + 7, -14),
|
||||
(-14, -14 + 7),
|
||||
(-14, -14 + 32 - 7),
|
||||
(-14 + 7, -14 + 32),
|
||||
(0, -14 + 32),
|
||||
a19 @ 0,
|
||||
)
|
||||
make_face()
|
||||
a14 = Circle(14 / 2, mode=Mode.SUBTRACT)
|
||||
|
||||
.. figure:: ./assets/complex_ex.svg
|
||||
:align: center
|
||||
|
||||
Implementation notes:
|
||||
|
||||
1. Build in traversal order around the perimeter. This keeps references local and makes
|
||||
later edits easier because each segment depends on nearby geometry.
|
||||
2. Keep helper entities private (``mode=Mode.PRIVATE``) so only final profile edges
|
||||
contribute to the resulting face.
|
||||
3. Use named construction geometry (``c_...``) for intersections and arc centers; this
|
||||
improves readability and debugability.
|
||||
4. Use constrained constructors only where they add value (for example :class:`~objects_curve.ConstrainedArcs`),
|
||||
and use direct primitives elsewhere.
|
||||
5. Create a :class:`~topology.Face` (``make_face`` then center-hole subtraction) only after
|
||||
the perimeter is fully defined.
|
||||
|
||||
Troubleshooting
|
||||
===============
|
||||
|
||||
- Too many results:
|
||||
add qualifiers and a stricter ``selector``.
|
||||
- No results:
|
||||
relax qualifier (start with ``UNQUALIFIED``) and verify geometry is coplanar.
|
||||
- Unstable branch selection:
|
||||
avoid index-only selection when topology changes; prefer geometric sorting.
|
||||
- Builder mode unexpectedly adds many edges:
|
||||
provide ``selector`` explicitly in the constructor call.
|
||||
|
|
@ -11,6 +11,7 @@ as later tutorials build on the concepts introduced in earlier ones.
|
|||
|
||||
tutorial_design.rst
|
||||
tutorial_selectors.rst
|
||||
tutorial_constraints.rst
|
||||
tutorial_lego.rst
|
||||
tutorial_joints.rst
|
||||
examples_1.rst
|
||||
|
|
|
|||