Added Internal path.

--HG--
branch : feature
This commit is contained in:
Roman Telezhynskyi 2016-12-03 18:01:39 +02:00
parent e93eacc655
commit 35f54c5cc7
24 changed files with 554 additions and 173 deletions

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<pattern>
<!--Pattern created with Valentina (http://www.valentina-project.org/).-->
<version>0.3.1</version>
<version>0.4.0</version>
<unit>cm</unit>
<author>Timo Virtaneva</author>
<description>This a male shirt pattern.
@ -14,7 +14,7 @@ The design is based on the measuring table. The table must be loaded, but the va
Adjust/verify curves after parameter modifications.
Delete layouts which are not needed.</description>
<notes></notes>
<notes/>
<measurements>MaleShirt.vit</measurements>
<increments>
<increment name="#ToBeVerified" description="" formula="0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0"/>
@ -197,49 +197,55 @@ Delete layouts which are not needed.</description>
<point type="modeling" inUse="true" id="440" idObject="55" mx="0.132292" my="0.264583"/>
</modeling>
<details>
<detail closed="1" id="174" name="Yoke" supplement="1" mx="-8.05221" width="1" my="3.27846">
<node type="NodePoint" nodeType="Contour" idObject="167" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="168" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="169" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="170" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="171" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="172" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="173" mx="0" my="0"/>
<detail closed="1" id="174" name="Yoke" seamAllowance="1" mx="-8.05221" width="1" my="3.27846" version="1">
<nodes>
<node type="NodePoint" idObject="167" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="168" mx="0" my="0"/>
<node type="NodePoint" idObject="169" mx="0" my="0"/>
<node type="NodePoint" idObject="170" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="171" mx="0" my="0"/>
<node type="NodePoint" idObject="172" mx="0" my="0"/>
<node type="NodePoint" idObject="173" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="401" name="FrontPanel" supplement="1" mx="-11.0934" width="1" my="6.43098">
<node type="NodePoint" nodeType="Contour" idObject="389" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="390" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="391" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="392" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="393" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="394" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="395" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="396" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="397" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="398" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="399" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="400" mx="0" my="0"/>
<detail closed="1" id="401" name="FrontPanel" seamAllowance="1" mx="-11.0934" width="1" my="6.43098" version="1">
<nodes>
<node type="NodePoint" idObject="389" mx="0" my="0"/>
<node type="NodePoint" idObject="390" mx="0" my="0"/>
<node type="NodePoint" idObject="391" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="392" mx="0" my="0"/>
<node type="NodePoint" idObject="393" mx="0" my="0"/>
<node type="NodePoint" idObject="394" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="395" mx="0" my="0"/>
<node type="NodePoint" idObject="396" mx="0" my="0"/>
<node type="NodePoint" idObject="397" mx="0" my="0"/>
<node type="NodePoint" idObject="398" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="399" mx="0" my="0"/>
<node type="NodePoint" idObject="400" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="441" name="BackPanel" supplement="1" mx="-7.55641" width="1" my="6.27021">
<node type="NodePoint" nodeType="Contour" idObject="422" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="423" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="424" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="425" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="426" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="427" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="428" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="429" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="430" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="431" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="432" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="433" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="434" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="435" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="436" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="437" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="438" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="439" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="440" mx="0" my="0"/>
<detail closed="1" id="441" name="BackPanel" seamAllowance="1" mx="-7.55641" width="1" my="6.27021" version="1">
<nodes>
<node type="NodePoint" idObject="422" mx="0" my="0"/>
<node type="NodePoint" idObject="423" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="424" mx="0" my="0"/>
<node type="NodePoint" idObject="425" mx="0" my="0"/>
<node type="NodePoint" idObject="426" mx="0" my="0"/>
<node type="NodePoint" idObject="427" mx="0" my="0"/>
<node type="NodePoint" idObject="428" mx="0" my="0"/>
<node type="NodePoint" idObject="429" mx="0" my="0"/>
<node type="NodePoint" idObject="430" mx="0" my="0"/>
<node type="NodePoint" idObject="431" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="432" mx="0" my="0"/>
<node type="NodePoint" idObject="433" mx="0" my="0"/>
<node type="NodePoint" idObject="434" mx="0" my="0"/>
<node type="NodePoint" idObject="435" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="436" mx="0" my="0"/>
<node type="NodePoint" idObject="437" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="438" mx="0" my="0"/>
<node type="NodePoint" idObject="439" mx="0" my="0"/>
<node type="NodePoint" idObject="440" mx="0" my="0"/>
</nodes>
</detail>
</details>
<groups/>
@ -310,36 +316,44 @@ Delete layouts which are not needed.</description>
<spline type="modelingPath" inUse="true" id="331" idObject="312"/>
</modeling>
<details>
<detail closed="1" id="182" name="Pocket" supplement="1" mx="68.0595" width="1" my="45.4124">
<node type="NodePoint" nodeType="Contour" idObject="175" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="176" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="177" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="178" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="179" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="180" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="181" mx="0" my="0"/>
<detail closed="1" id="182" name="Pocket" seamAllowance="1" mx="68.0595" width="1" my="45.4124" version="1">
<nodes>
<node type="NodePoint" idObject="175" mx="0" my="0"/>
<node type="NodePoint" idObject="176" mx="0" my="0"/>
<node type="NodePoint" idObject="177" mx="0" my="0"/>
<node type="NodePoint" idObject="178" mx="0" my="0"/>
<node type="NodePoint" idObject="179" mx="0" my="0"/>
<node type="NodePoint" idObject="180" mx="0" my="0"/>
<node type="NodePoint" idObject="181" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="320" name="PocketRound" supplement="1" mx="81.7244" width="1" my="45.8357">
<node type="NodePoint" nodeType="Contour" idObject="314" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="315" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="316" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="317" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="318" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="319" mx="0" my="0"/>
<detail closed="1" id="320" name="PocketRound" seamAllowance="1" mx="81.7244" width="1" my="45.8357" version="1">
<nodes>
<node type="NodePoint" idObject="314" mx="0" my="0"/>
<node type="NodePoint" idObject="315" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="316" mx="0" my="0"/>
<node type="NodePoint" idObject="317" mx="0" my="0"/>
<node type="NodePoint" idObject="318" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="319" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="326" name="PocketFlap" supplement="1" mx="67.876" width="1" my="32.9628">
<node type="NodePoint" nodeType="Contour" idObject="321" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="322" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="323" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="324" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="325" mx="0" my="0"/>
<detail closed="1" id="326" name="PocketFlap" seamAllowance="1" mx="67.876" width="1" my="32.9628" version="1">
<nodes>
<node type="NodePoint" idObject="321" mx="0" my="0"/>
<node type="NodePoint" idObject="322" mx="0" my="0"/>
<node type="NodePoint" idObject="323" mx="0" my="0"/>
<node type="NodePoint" idObject="324" mx="0" my="0"/>
<node type="NodePoint" idObject="325" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="332" name="PocketFlapRound" supplement="1" mx="81.7244" width="1" my="32.9627">
<node type="NodePoint" nodeType="Contour" idObject="327" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="328" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="329" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="330" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="331" mx="0" my="0"/>
<detail closed="1" id="332" name="PocketFlapRound" seamAllowance="1" mx="81.7244" width="1" my="32.9627" version="1">
<nodes>
<node type="NodePoint" idObject="327" mx="0" my="0"/>
<node type="NodePoint" idObject="328" mx="0" my="0"/>
<node type="NodePoint" idObject="329" mx="0" my="0"/>
<node type="NodePoint" idObject="330" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="331" mx="0" my="0"/>
</nodes>
</detail>
</details>
<groups/>
@ -447,45 +461,53 @@ Delete layouts which are not needed.</description>
<point type="modeling" inUse="true" id="299" idObject="97" mx="-0.222289" my="0.696084"/>
</modeling>
<details>
<detail closed="1" id="204" name="Collar" supplement="1" mx="27.4551" width="1" my="0.587081">
<node type="NodePoint" nodeType="Contour" idObject="200" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="201" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="202" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="203" mx="0" my="0"/>
<detail closed="1" id="204" name="Collar" seamAllowance="1" mx="27.4551" width="1" my="0.587081" version="1">
<nodes>
<node type="NodePoint" idObject="200" mx="0" my="0"/>
<node type="NodePoint" idObject="201" mx="0" my="0"/>
<node type="NodePoint" idObject="202" mx="0" my="0"/>
<node type="NodePoint" idObject="203" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="209" name="CuffInterface" supplement="0" mx="26.9909" width="1" my="-8.22145">
<node type="NodePoint" nodeType="Contour" idObject="205" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="206" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="207" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="208" mx="0" my="0"/>
<detail closed="1" id="209" name="CuffInterface" seamAllowance="0" mx="26.9909" width="1" my="-8.22145" version="1">
<nodes>
<node type="NodePoint" idObject="205" mx="0" my="0"/>
<node type="NodePoint" idObject="206" mx="0" my="0"/>
<node type="NodePoint" idObject="207" mx="0" my="0"/>
<node type="NodePoint" idObject="208" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="217" name="ShortSleeve" supplement="1" mx="-16.9664" width="1" my="-23.4126">
<node type="NodePoint" nodeType="Contour" idObject="210" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="211" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="212" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="213" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="214" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="215" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="216" mx="0" my="0"/>
<detail closed="1" id="217" name="ShortSleeve" seamAllowance="1" mx="-16.9664" width="1" my="-23.4126" version="1">
<nodes>
<node type="NodePoint" idObject="210" mx="0" my="0"/>
<node type="NodePoint" idObject="211" mx="0" my="0"/>
<node type="NodePoint" idObject="212" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="213" mx="0" my="0"/>
<node type="NodePoint" idObject="214" mx="0" my="0"/>
<node type="NodePoint" idObject="215" mx="0" my="0"/>
<node type="NodePoint" idObject="216" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="300" name="FullSleeve" supplement="1" mx="-16.0896" width="1" my="15.2013">
<node type="NodePoint" nodeType="Contour" idObject="283" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" nodeType="Contour" idObject="284" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="285" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="286" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" nodeType="Contour" idObject="287" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="288" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="289" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="290" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="291" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="292" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="293" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="294" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="295" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="296" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="297" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="298" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="299" mx="0" my="0"/>
<detail closed="1" id="300" name="FullSleeve" seamAllowance="1" mx="-16.0896" width="1" my="15.2013" version="1">
<nodes>
<node type="NodePoint" idObject="283" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" idObject="284" mx="0" my="0"/>
<node type="NodePoint" idObject="285" mx="0" my="0"/>
<node type="NodePoint" idObject="286" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="0" idObject="287" mx="0" my="0"/>
<node type="NodePoint" idObject="288" mx="0" my="0"/>
<node type="NodePoint" idObject="289" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="290" mx="0" my="0"/>
<node type="NodePoint" idObject="291" mx="0" my="0"/>
<node type="NodePoint" idObject="292" mx="0" my="0"/>
<node type="NodePoint" idObject="293" mx="0" my="0"/>
<node type="NodePoint" idObject="294" mx="0" my="0"/>
<node type="NodePoint" idObject="295" mx="0" my="0"/>
<node type="NodePoint" idObject="296" mx="0" my="0"/>
<node type="NodePoint" idObject="297" mx="0" my="0"/>
<node type="NodePoint" idObject="298" mx="0" my="0"/>
<node type="NodePoint" idObject="299" mx="0" my="0"/>
</nodes>
</detail>
</details>
<groups/>
@ -543,37 +565,45 @@ Delete layouts which are not needed.</description>
<spline type="modelingSpline" inUse="true" id="254" idObject="248"/>
</modeling>
<details>
<detail closed="1" id="224" name="CollarBase" supplement="1" mx="28.4767" width="1" my="21.6501">
<node type="NodePoint" nodeType="Contour" idObject="218" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="219" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="220" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="221" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" nodeType="Contour" idObject="222" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="223" mx="0" my="0"/>
<detail closed="1" id="224" name="CollarBase" seamAllowance="1" mx="28.4767" width="1" my="21.6501" version="1">
<nodes>
<node type="NodePoint" idObject="218" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="219" mx="0" my="0"/>
<node type="NodePoint" idObject="220" mx="0" my="0"/>
<node type="NodePoint" idObject="221" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" idObject="222" mx="0" my="0"/>
<node type="NodePoint" idObject="223" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="231" name="CollarBaseInterface" supplement="0" mx="28.6569" width="1" my="15.2047">
<node type="NodePoint" nodeType="Contour" idObject="225" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" nodeType="Contour" idObject="226" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="227" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="228" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" nodeType="Contour" idObject="229" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="230" mx="0" my="0"/>
<detail closed="1" id="231" name="CollarBaseInterface" seamAllowance="0" mx="28.6569" width="1" my="15.2047" version="1">
<nodes>
<node type="NodePoint" idObject="225" mx="0" my="0"/>
<node type="NodeSplinePath" reverse="1" idObject="226" mx="0" my="0"/>
<node type="NodePoint" idObject="227" mx="0" my="0"/>
<node type="NodePoint" idObject="228" mx="0" my="0"/>
<node type="NodeSpline" reverse="1" idObject="229" mx="0" my="0"/>
<node type="NodePoint" idObject="230" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="238" name="CollarTop" supplement="1" mx="28.0866" width="1" my="9.53729">
<node type="NodePoint" nodeType="Contour" idObject="232" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="233" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="234" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="235" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="236" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="237" mx="0" my="0"/>
<detail closed="1" id="238" name="CollarTop" seamAllowance="1" mx="28.0866" width="1" my="9.53729" version="1">
<nodes>
<node type="NodePoint" idObject="232" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="233" mx="0" my="0"/>
<node type="NodePoint" idObject="234" mx="0" my="0"/>
<node type="NodePoint" idObject="235" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="236" mx="0" my="0"/>
<node type="NodePoint" idObject="237" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="255" name="CollarTopInterface" supplement="0" mx="27.8619" width="1" my="-1.37137">
<node type="NodePoint" nodeType="Contour" idObject="249" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="250" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="251" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="252" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="253" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" nodeType="Contour" idObject="254" mx="0" my="0"/>
<detail closed="1" id="255" name="CollarTopInterface" seamAllowance="0" mx="27.8619" width="1" my="-1.37137" version="1">
<nodes>
<node type="NodePoint" idObject="249" mx="0" my="0"/>
<node type="NodePoint" idObject="250" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="251" mx="0" my="0"/>
<node type="NodePoint" idObject="252" mx="0" my="0"/>
<node type="NodePoint" idObject="253" mx="0" my="0"/>
<node type="NodeSpline" reverse="0" idObject="254" mx="0" my="0"/>
</nodes>
</detail>
</details>
<groups/>
@ -609,20 +639,24 @@ Delete layouts which are not needed.</description>
<point type="modeling" inUse="true" id="281" idObject="260" mx="0.132292" my="0.264583"/>
</modeling>
<details>
<detail closed="1" id="274" name="PlacketUnder" supplement="1" mx="27.725" width="1" my="-0.179464">
<node type="NodePoint" nodeType="Contour" idObject="270" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="271" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="272" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="273" mx="0" my="0"/>
<detail closed="1" id="274" name="PlacketUnder" seamAllowance="1" mx="27.725" width="1" my="-0.179464" version="1">
<nodes>
<node type="NodePoint" idObject="270" mx="0" my="0"/>
<node type="NodePoint" idObject="271" mx="0" my="0"/>
<node type="NodePoint" idObject="272" mx="0" my="0"/>
<node type="NodePoint" idObject="273" mx="0" my="0"/>
</nodes>
</detail>
<detail closed="1" id="282" name="PlacketTop" supplement="1" mx="46.1968" width="1" my="-5.58778">
<node type="NodePoint" nodeType="Contour" idObject="275" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="276" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="277" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="278" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="279" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="280" mx="0" my="0"/>
<node type="NodePoint" nodeType="Contour" idObject="281" mx="0" my="0"/>
<detail closed="1" id="282" name="PlacketTop" seamAllowance="1" mx="46.1968" width="1" my="-5.58778" version="1">
<nodes>
<node type="NodePoint" idObject="275" mx="0" my="0"/>
<node type="NodePoint" idObject="276" mx="0" my="0"/>
<node type="NodePoint" idObject="277" mx="0" my="0"/>
<node type="NodePoint" idObject="278" mx="0" my="0"/>
<node type="NodePoint" idObject="279" mx="0" my="0"/>
<node type="NodePoint" idObject="280" mx="0" my="0"/>
<node type="NodePoint" idObject="281" mx="0" my="0"/>
</nodes>
</detail>
</details>
<groups/>

View File

@ -747,7 +747,8 @@ void VPattern::ParseDetailElement(const QDomElement &domElement, const Document
<< TagData
<< TagPatternInfo
<< TagGrainline
<< VToolSeamAllowance::TagCSA;
<< VToolSeamAllowance::TagCSA
<< VToolSeamAllowance::TagIPaths;
const QDomNodeList nodeList = domElement.childNodes();
for (qint32 i = 0; i < nodeList.size(); ++i)
@ -780,6 +781,8 @@ void VPattern::ParseDetailElement(const QDomElement &domElement, const Document
case 4:// VToolSeamAllowance::TagCSA
ParseDetailCSARecords(element, detail);
break;
case 5:// VToolSeamAllowance::TagIPaths
ParseDetailInternalPaths(element, detail);
default:
break;
}
@ -875,7 +878,8 @@ void VPattern::ParseDetailNodes(const QDomElement &domElement, VPiece &detail, b
for (qint32 i = 0; i < nodeList.size(); ++i)
{
const QDomElement element = nodeList.at(i).toElement();
if (not element.isNull() && element.tagName() == VAbstractPattern::TagNode)
if (not element.isNull()
&& element.tagName() == VAbstractPattern::TagNode) // Old detail version need this check!
{
oldNodes.append(ParseDetailNode(element));
}
@ -891,7 +895,7 @@ void VPattern::ParsePieceNodes(const QDomElement &domElement, VPiece &detail) co
for (qint32 i = 0; i < nodeList.size(); ++i)
{
const QDomElement element = nodeList.at(i).toElement();
if (not element.isNull() && element.tagName() == VAbstractPattern::TagNode)
if (not element.isNull())
{
detail.GetPath().Append(ParseSANode(element));
}
@ -906,7 +910,7 @@ void VPattern::ParseDetailCSARecords(const QDomElement &domElement, VPiece &deta
for (qint32 i = 0; i < nodeList.size(); ++i)
{
const QDomElement element = nodeList.at(i).toElement();
if (not element.isNull() && element.tagName() == VToolSeamAllowance::TagRecord)
if (not element.isNull())
{
CustomSARecord record;
record.startPoint = GetParametrUInt(element, VToolSeamAllowance::AttrStart, NULL_ID_STR);
@ -922,6 +926,26 @@ void VPattern::ParseDetailCSARecords(const QDomElement &domElement, VPiece &deta
detail.SetCustomSARecords(records);
}
//---------------------------------------------------------------------------------------------------------------------
void VPattern::ParseDetailInternalPaths(const QDomElement &domElement, VPiece &detail) const
{
QVector<quint32> records;
const QDomNodeList nodeList = domElement.childNodes();
for (qint32 i = 0; i < nodeList.size(); ++i)
{
const QDomElement element = nodeList.at(i).toElement();
if (not element.isNull())
{
const quint32 path = GetParametrUInt(element, VToolSeamAllowance::AttrPath, NULL_ID_STR);
if (path > NULL_ID)
{
records.append(path);
}
}
}
detail.SetInternalPaths(records);
}
//---------------------------------------------------------------------------------------------------------------------
/**
* @brief ParseDetails parse details tag.
@ -3131,6 +3155,7 @@ void VPattern::ParsePathElement(VMainGraphicsScene *scene, QDomElement &domEleme
const QString defType = QString().setNum(static_cast<int>(PiecePathType::CustomSeamAllowance));
const PiecePathType type = static_cast<PiecePathType>(GetParametrUInt(domElement, AttrType, defType));
const quint32 idTool = GetParametrUInt(domElement, VAbstractNode::AttrIdTool, NULL_ID_STR);
const QString penType = GetParametrString(domElement, AttrTypeLine, TypeLineLine);
VPiecePath path;
const QDomElement element = domElement.firstChildElement(VAbstractPattern::TagNodes);
@ -3141,6 +3166,7 @@ void VPattern::ParsePathElement(VMainGraphicsScene *scene, QDomElement &domEleme
path.SetType(type);
path.SetName(name);
path.SetPenType(VAbstractTool::LineStyleToPenStyle(penType));
VToolPiecePath::Create(id, path, 0, scene, this, data, parse, Source::FromFile, "", idTool);
}

View File

@ -123,6 +123,7 @@ private:
void ParseDetailNodes(const QDomElement &domElement, VPiece &detail, bool closed) const;
void ParsePieceNodes(const QDomElement &domElement, VPiece &detail) const;
void ParseDetailCSARecords(const QDomElement &domElement, VPiece &detail) const;
void ParseDetailInternalPaths(const QDomElement &domElement, VPiece &detail) const;
void ParseDetails(const QDomElement &domElement, const Document &parse);
void ParsePointElement(VMainGraphicsScene *scene, QDomElement &domElement,

View File

@ -329,6 +329,7 @@
<xs:attribute name="idTool" type="xs:unsignedInt"></xs:attribute>
<xs:attribute name="inUse" type="xs:boolean"></xs:attribute>
<xs:attribute name="name" type="xs:string"></xs:attribute>
<xs:attribute name="typeLine" type="xs:string"></xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="tools" minOccurs="0" maxOccurs="unbounded">
@ -451,6 +452,17 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="iPaths" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="record" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="path" type="xs:unsignedInt" use="required"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedInt" use="required"></xs:attribute>
<xs:attribute name="version" type="pieceVersion"></xs:attribute>

View File

@ -269,6 +269,18 @@ void VPiece::SetUnited(bool united)
d->m_united = united;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<quint32> VPiece::GetInternalPaths() const
{
return d->m_internalPaths;
}
//---------------------------------------------------------------------------------------------------------------------
void VPiece::SetInternalPaths(const QVector<quint32> &iPaths)
{
d->m_internalPaths = iPaths;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<CustomSARecord> VPiece::GetCustomSARecords() const
{
@ -324,6 +336,37 @@ QVector<quint32> VPiece::MissingCSAPath(const VPiece &det) const
return r;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<quint32> VPiece::MissingInternalPaths(const VPiece &det) const
{
const QVector<quint32> detRecords = det.GetInternalPaths();
if (d->m_internalPaths.size() == detRecords.size()) //-V807
{
return QVector<quint32>();
}
QSet<quint32> set1;
for (qint32 i = 0; i < d->m_internalPaths.size(); ++i)
{
set1.insert(d->m_internalPaths.at(i));
}
QSet<quint32> set2;
for (qint32 j = 0; j < detRecords.size(); ++j)
{
set2.insert(detRecords.at(j));
}
const QList<quint32> set3 = set1.subtract(set2).toList();
QVector<quint32> r;
for (qint32 i = 0; i < set3.size(); ++i)
{
r.append(set3.at(i));
}
return r;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<CustomSARecord> VPiece::GetValidRecords() const
{

View File

@ -76,11 +76,15 @@ public:
bool IsUnited() const;
void SetUnited(bool united);
QVector<quint32> GetInternalPaths() const;
void SetInternalPaths(const QVector<quint32> &iPaths);
QVector<CustomSARecord> GetCustomSARecords() const;
void SetCustomSARecords(const QVector<CustomSARecord> &records);
QVector<quint32> MissingNodes(const VPiece &det) const;
QVector<quint32> MissingCSAPath(const VPiece &det) const;
QVector<quint32> MissingInternalPaths(const VPiece &det) const;
private:
QSharedDataPointer<VPieceData> d;

View File

@ -49,7 +49,8 @@ public:
m_my(0),
m_inLayout(true),
m_united(false),
m_customSARecords()
m_customSARecords(),
m_internalPaths()
{}
VPieceData(const VPieceData &detail)
@ -59,7 +60,8 @@ public:
m_my(detail.m_my),
m_inLayout(detail.m_inLayout),
m_united(detail.m_united),
m_customSARecords(detail.m_customSARecords)
m_customSARecords(detail.m_customSARecords),
m_internalPaths(detail.m_internalPaths)
{}
~VPieceData();
@ -74,6 +76,7 @@ public:
bool m_united;
QVector<CustomSARecord> m_customSARecords;
QVector<quint32> m_internalPaths;
private:
VPieceData &operator=(const VPieceData &) Q_DECL_EQ_DELETE;

View File

@ -130,6 +130,18 @@ void VPiecePath::SetName(const QString &name)
d->m_name = name;
}
//---------------------------------------------------------------------------------------------------------------------
Qt::PenStyle VPiecePath::GetPenType() const
{
return d->m_penType;
}
//---------------------------------------------------------------------------------------------------------------------
void VPiecePath::SetPenType(const Qt::PenStyle &type)
{
d->m_penType = type;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VPiecePath::PathPoints(const VContainer *data) const
{

View File

@ -68,6 +68,9 @@ public:
QString GetName() const;
void SetName(const QString &name);
Qt::PenStyle GetPenType() const;
void SetPenType(const Qt::PenStyle &type);
QVector<QPointF> PathPoints(const VContainer *data) const;
QVector<VPointF> PathNodePoints(const VContainer *data) const;
QVector<VSAPoint> SeamAllowancePoints(const VContainer *data, qreal width, bool reverse) const;

View File

@ -44,20 +44,23 @@ public:
VPiecePathData()
: m_nodes(),
m_type(PiecePathType::Unknown),
m_name()
m_name(),
m_penType(Qt::SolidLine)
{}
explicit VPiecePathData(PiecePathType type)
: m_nodes(),
m_type(type),
m_name()
m_name(),
m_penType(Qt::SolidLine)
{}
VPiecePathData(const VPiecePathData &path)
: QSharedData(path),
m_nodes(path.m_nodes),
m_type(path.m_type),
m_name(path.m_name)
m_name(path.m_name),
m_penType(path.m_penType)
{}
~VPiecePathData();
@ -65,6 +68,7 @@ public:
QVector<VPieceNode> m_nodes;
PiecePathType m_type;
QString m_name;
Qt::PenStyle m_penType;
private:
VPiecePathData &operator=(const VPiecePathData &) Q_DECL_EQ_DELETE;

View File

@ -30,6 +30,7 @@
#include "ui_dialogpiecepath.h"
#include "../vpatterndb/vpiecenode.h"
#include "visualization/path/vistoolpiecepath.h"
#include "../../tools/vabstracttool.h"
#include <QMenu>
@ -46,11 +47,17 @@ DialogPiecePath::DialogPiecePath(const VContainer *data, quint32 toolId, QWidget
ui->lineEditName->setClearButtonEnabled(true);
#endif
FillComboBoxTypeLine(ui->comboBoxPenType, VAbstractTool::LineStylesPics());
connect(ui->lineEditName, &QLineEdit::textChanged, this, &DialogPiecePath::NameChanged);
InitPathTypes();
connect(ui->comboBoxType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
[this](){ValidObjects(PathIsValid());});
[this]()
{
ui->comboBoxPenType->setEnabled(GetType() == PiecePathType::InternalPath);
ValidObjects(PathIsValid());
});
flagName = true;//We have default name of piece.
flagError = PathIsValid();
@ -376,7 +383,9 @@ void DialogPiecePath::ChangedSAAfter(double d)
void DialogPiecePath::InitPathTypes()
{
ui->comboBoxType->addItem(tr("Custom seam allowance"), static_cast<int>(PiecePathType::CustomSeamAllowance));
//ui->comboBoxType->addItem(tr("Internal path"), static_cast<int>(PiecePathType::InternalPath));
ui->comboBoxType->addItem(tr("Internal path"), static_cast<int>(PiecePathType::InternalPath));
ui->comboBoxPenType->setEnabled(GetType() == PiecePathType::InternalPath);
}
//---------------------------------------------------------------------------------------------------------------------
@ -468,6 +477,7 @@ void DialogPiecePath::SetPiecePath(const VPiecePath &path)
VisToolPiecePath *visPath = qobject_cast<VisToolPiecePath *>(vis);
SCASSERT(visPath != nullptr);
visPath->SetPath(path);
SetPenType(path.GetPenType());
ValidObjects(PathIsValid());
@ -495,6 +505,21 @@ void DialogPiecePath::SetType(PiecePathType type)
{
ui->comboBoxType->setCurrentIndex(index);
}
ui->comboBoxPenType->setEnabled(type == PiecePathType::InternalPath);
}
//---------------------------------------------------------------------------------------------------------------------
Qt::PenStyle DialogPiecePath::GetPenType() const
{
return VAbstractTool::LineStyleToPenStyle(GetComboBoxCurrentData(ui->comboBoxPenType, TypeLineLine));
}
//---------------------------------------------------------------------------------------------------------------------
void DialogPiecePath::SetPenType(const Qt::PenStyle &type)
{
ChangeCurrentData(ui->comboBoxPenType, VAbstractTool::PenStyleToLineStyle(type));
vis->setLineStyle(type);
}
//---------------------------------------------------------------------------------------------------------------------
@ -635,6 +660,7 @@ VPiecePath DialogPiecePath::CreatePath() const
path.SetType(GetType());
path.SetName(ui->lineEditName->text());
path.SetPenType(GetType() == PiecePathType::InternalPath ? GetPenType() : Qt::SolidLine);
return path;
}

View File

@ -94,6 +94,9 @@ private:
PiecePathType GetType() const;
void SetType(PiecePathType type);
Qt::PenStyle GetPenType() const;
void SetPenType(const Qt::PenStyle &type);
QListWidgetItem *GetItemById(quint32 id);
void SetCurrentSABefore(qreal value);

View File

@ -60,16 +60,39 @@
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxType"/>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="labelPiece">
<property name="text">
<string>Piece:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxPiece"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelPenType">
<property name="text">
<string>Type of pen:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxPenType">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="iconSize">
<size>
<width>80</width>
<height>14</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>

View File

@ -106,6 +106,10 @@ DialogSeamAllowance::DialogSeamAllowance(const VContainer *data, const quint32 &
connect(ui->comboBoxIncludeType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&DialogSeamAllowance::CSAIncludeTypeChanged);
ui->listWidgetInternalPaths->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->listWidgetInternalPaths, &QListWidget::customContextMenuRequested, this,
&DialogSeamAllowance::ShowInternalPathsContextMenu);
if (not applyAllowed)
{
vis = new VisToolPiece(data);
@ -127,6 +131,7 @@ void DialogSeamAllowance::EnableApply(bool enable)
bApply->setEnabled(enable);
applyAllowed = enable;
ui->tabSeamAllowance->setEnabled(applyAllowed);
ui->tabInternalPaths->setEnabled(applyAllowed);
}
//---------------------------------------------------------------------------------------------------------------------
@ -153,6 +158,13 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece)
}
ui->listWidgetCustomSA->blockSignals(false);
ui->listWidgetInternalPaths->clear();
const QVector<quint32> iPaths = piece.GetInternalPaths();
for (int i = 0; i < iPaths.size(); ++i)
{
NewInternalPath(iPaths.at(i));
}
ui->comboBoxStartPoint->blockSignals(true);
ui->comboBoxStartPoint->clear();
ui->comboBoxStartPoint->blockSignals(false);
@ -347,7 +359,7 @@ void DialogSeamAllowance::ShowCustomSAContextMenu(const QPoint &pos)
{
record.reverse = not record.reverse;
rowItem->setData(Qt::UserRole, QVariant::fromValue(record));
rowItem->setText(GetCustomSARecordName(record));
rowItem->setText(GetPathName(record.path, record.reverse));
}
else if (selectedAction == actionOption)
{
@ -366,6 +378,42 @@ void DialogSeamAllowance::ShowCustomSAContextMenu(const QPoint &pos)
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogSeamAllowance::ShowInternalPathsContextMenu(const QPoint &pos)
{
const int row = ui->listWidgetInternalPaths->currentRow();
if (ui->listWidgetInternalPaths->count() == 0 || row == -1 || row >= ui->listWidgetInternalPaths->count())
{
return;
}
QMenu *menu = new QMenu(this);
QAction *actionDelete = menu->addAction(QIcon::fromTheme("edit-delete"), tr("Delete"));
QListWidgetItem *rowItem = ui->listWidgetInternalPaths->item(row);
SCASSERT(rowItem != nullptr);
const quint32 pathId = qvariant_cast<quint32>(rowItem->data(Qt::UserRole));
QAction *actionOption = menu->addAction(QIcon::fromTheme("preferences-other"), tr("Options"));
QAction *selectedAction = menu->exec(ui->listWidgetInternalPaths->viewport()->mapToGlobal(pos));
if (selectedAction == actionDelete)
{
delete ui->listWidgetInternalPaths->item(row);
}
else if (selectedAction == actionOption)
{
auto *dialog = new DialogPiecePath(data, pathId, this);
dialog->SetPiecePath(data->GetPiecePath(pathId));
dialog->SetPieceId(toolId);
dialog->EnbleShowMode(true);
m_dialog = dialog;
m_dialog->setModal(true);
connect(m_dialog.data(), &DialogTool::DialogClosed, this, &DialogSeamAllowance::PathDialogClosed);
m_dialog->show();
}
}
//---------------------------------------------------------------------------------------------------------------------
void DialogSeamAllowance::ListChanged()
{
@ -662,7 +710,8 @@ void DialogSeamAllowance::PathDialogClosed(int result)
const_cast<VContainer *>(data),
dialogTool->GetToolId());
qApp->getUndoStack()->push(saveCommand);
UpdateCurrentRecord();
UpdateCurrentCustomSARecord();
UpdateCurrentInternalPathRecord();
}
catch (const VExceptionBadId &e)
{
@ -691,6 +740,14 @@ VPiece DialogSeamAllowance::CreatePiece() const
}
piece.SetCustomSARecords(records);
QVector<quint32> iPaths;
for (qint32 i = 0; i < ui->listWidgetInternalPaths->count(); ++i)
{
QListWidgetItem *item = ui->listWidgetInternalPaths->item(i);
iPaths.append(qvariant_cast<quint32>(item->data(Qt::UserRole)));
}
piece.SetInternalPaths(iPaths);
piece.SetForbidFlipping(ui->checkBoxForbidFlipping->isChecked());
piece.SetSeamAllowance(ui->checkBoxSeams->isChecked());
piece.SetSAWidth(ui->doubleSpinBoxSeams->value());
@ -711,7 +768,7 @@ void DialogSeamAllowance::NewCustomSA(const CustomSARecord &record)
{
if (record.path > NULL_ID)
{
const QString name = GetCustomSARecordName(record);
const QString name = GetPathName(record.path, record.reverse);
QListWidgetItem *item = new QListWidgetItem(name);
item->setFont(QFont("Times", 12, QFont::Bold));
@ -722,16 +779,30 @@ void DialogSeamAllowance::NewCustomSA(const CustomSARecord &record)
}
//---------------------------------------------------------------------------------------------------------------------
QString DialogSeamAllowance::GetCustomSARecordName(const CustomSARecord &record) const
void DialogSeamAllowance::NewInternalPath(quint32 path)
{
if (path > NULL_ID)
{
const QString name = GetPathName(path);
QListWidgetItem *item = new QListWidgetItem(name);
item->setFont(QFont("Times", 12, QFont::Bold));
item->setData(Qt::UserRole, QVariant::fromValue(path));
ui->listWidgetInternalPaths->addItem(item);
ui->listWidgetInternalPaths->setCurrentRow(ui->listWidgetInternalPaths->count()-1);
}
}
//---------------------------------------------------------------------------------------------------------------------
QString DialogSeamAllowance::GetPathName(quint32 path, bool reverse) const
{
QString name;
if (record.path > NULL_ID)
if (path > NULL_ID)
{
const VPiecePath path = data->GetPiecePath(record.path);
name = path.GetName();
name = data->GetPiecePath(path).GetName();
if (record.reverse)
if (reverse)
{
name = QLatin1String("- ") + name;
}
@ -934,7 +1005,7 @@ void DialogSeamAllowance::InitSAIncludeType()
}
//---------------------------------------------------------------------------------------------------------------------
void DialogSeamAllowance::UpdateCurrentRecord()
void DialogSeamAllowance::UpdateCurrentCustomSARecord()
{
const int row = ui->listWidgetCustomSA->currentRow();
if (ui->listWidgetCustomSA->count() == 0 || row == -1)
@ -945,5 +1016,20 @@ void DialogSeamAllowance::UpdateCurrentRecord()
QListWidgetItem *item = ui->listWidgetCustomSA->item(row);
SCASSERT(item != nullptr);
const CustomSARecord record = qvariant_cast<CustomSARecord>(item->data(Qt::UserRole));
item->setText(GetCustomSARecordName(record));
item->setText(GetPathName(record.path, record.reverse));
}
//---------------------------------------------------------------------------------------------------------------------
void DialogSeamAllowance::UpdateCurrentInternalPathRecord()
{
const int row = ui->listWidgetInternalPaths->currentRow();
if (ui->listWidgetInternalPaths->count() == 0 || row == -1)
{
return;
}
QListWidgetItem *item = ui->listWidgetInternalPaths->item(row);
SCASSERT(item != nullptr);
const quint32 path = qvariant_cast<quint32>(item->data(Qt::UserRole));
item->setText(GetPathName(path));
}

View File

@ -62,6 +62,8 @@ protected:
private slots:
void ShowMainPathContextMenu(const QPoint &pos);
void ShowCustomSAContextMenu(const QPoint &pos);
void ShowInternalPathsContextMenu(const QPoint &pos);
void ListChanged();
void EnableSeamAllowance(bool enable);
void NodeChanged(int index);
@ -90,14 +92,16 @@ private:
void NewMainPathItem(const VPieceNode &node);
void NewCustomSA(const CustomSARecord &record);
QString GetCustomSARecordName(const CustomSARecord &record) const;
void NewInternalPath(quint32 path);
QString GetPathName(quint32 path, bool reverse = false) const;
bool MainPathIsValid() const;
void ValidObjects(bool value);
bool MainPathIsClockwise() const;
void InitNodesList();
void InitCSAPoint(QComboBox *box);
void InitSAIncludeType();
void UpdateCurrentRecord();
void UpdateCurrentCustomSARecord();
void UpdateCurrentInternalPathRecord();
QListWidgetItem *GetItemById(quint32 id);

View File

@ -385,6 +385,20 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabInternalPaths">
<attribute name="title">
<string>Internal paths</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QListWidget" name="listWidgetInternalPaths">
<property name="dragDropMode">
<enum>QAbstractItemView::InternalMove</enum>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>

View File

@ -173,6 +173,7 @@ void VToolPiecePath::AddAttributes(VAbstractPattern *doc, QDomElement &domElemen
doc->SetAttribute(domElement, VDomDocument::AttrId, id);
doc->SetAttribute(domElement, AttrName, path.GetName());
doc->SetAttribute(domElement, AttrType, static_cast<int>(path.GetType()));
doc->SetAttribute(domElement, AttrTypeLine, PenStyleToLineStyle(path.GetPenType()));
}
//---------------------------------------------------------------------------------------------------------------------
@ -219,7 +220,9 @@ void VToolPiecePath::AddToFile()
if (path.GetType() == PiecePathType::InternalPath)
{
QVector<quint32> iPaths = newDet.GetInternalPaths();
iPaths.append(id);
newDet.SetInternalPaths(iPaths);
}
else if (path.GetType() == PiecePathType::CustomSeamAllowance)
{
@ -287,7 +290,11 @@ void VToolPiecePath::RefreshGeometry()
{
QPainterPath p = path.PainterPath(this->getData());
p.setFillRule(Qt::OddEvenFill);
this->setPath(p);
QPen pen = this->pen();
pen.setStyle(path.GetPenType());
this->setPen(pen);
}
}

View File

@ -197,6 +197,35 @@ Qt::PenStyle VAbstractTool::LineStyleToPenStyle(const QString &typeLine)
}
}
//---------------------------------------------------------------------------------------------------------------------
QString VAbstractTool::PenStyleToLineStyle(Qt::PenStyle penStyle)
{
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wswitch-default")
switch (penStyle)
{
case Qt::NoPen:
return TypeLineNone;
case Qt::DashLine:
return TypeLineDashLine;
case Qt::DotLine:
return TypeLineDotLine;
case Qt::DashDotLine:
return TypeLineDashDotLine;
case Qt::DashDotDotLine:
return TypeLineDashDotDotLine;
case Qt::SolidLine:
case Qt::CustomDashLine:
default:
break;
}
QT_WARNING_POP
return TypeLineLine;
}
//---------------------------------------------------------------------------------------------------------------------
QMap<QString, QIcon> VAbstractTool::LineStylesPics()
{

View File

@ -75,6 +75,7 @@ public:
static const QStringList StylesList();
static Qt::PenStyle LineStyleToPenStyle(const QString &typeLine);
static QString PenStyleToLineStyle(Qt::PenStyle penStyle);
static QMap<QString, QIcon> LineStylesPics();
static const QStringList Colors();

View File

@ -34,6 +34,7 @@
#include "nodeDetails/vnodepoint.h"
#include "nodeDetails/vnodespline.h"
#include "nodeDetails/vnodesplinepath.h"
#include "nodeDetails/vtoolpiecepath.h"
#include "../vgeometry/varc.h"
#include "../vgeometry/vcubicbezier.h"
#include "../vgeometry/vcubicbezierpath.h"
@ -59,6 +60,7 @@ const quint8 VToolSeamAllowance::pieceVersion = 2;
const QString VToolSeamAllowance::TagCSA = QStringLiteral("csa");
const QString VToolSeamAllowance::TagRecord = QStringLiteral("record");
const QString VToolSeamAllowance::TagIPaths = QStringLiteral("iPaths");
const QString VToolSeamAllowance::AttrVersion = QStringLiteral("version");
const QString VToolSeamAllowance::AttrForbidFlipping = QStringLiteral("forbidFlipping");
@ -263,6 +265,22 @@ void VToolSeamAllowance::AddCSARecords(VAbstractPattern *doc, QDomElement &domEl
}
}
//---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::AddInternalPaths(VAbstractPattern *doc, QDomElement &domElement, const QVector<quint32> &paths)
{
if (paths.size() > 0)
{
QDomElement iPathsElement = doc->createElement(VToolSeamAllowance::TagIPaths);
for (int i = 0; i < paths.size(); ++i)
{
QDomElement recordNode = doc->createElement(VToolSeamAllowance::TagRecord);
doc->SetAttribute(recordNode, AttrPath, paths.at(i));
iPathsElement.appendChild(recordNode);
}
domElement.appendChild(iPathsElement);
}
}
//---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::AddPatternPieceData(VAbstractPattern *doc, QDomElement &domElement, const VPiece &piece)
{
@ -362,6 +380,7 @@ void VToolSeamAllowance::AddToFile()
AddNodes(doc, domElement, piece);
//custom seam allowance
AddCSARecords(doc, domElement, piece.GetCustomSARecords());
AddInternalPaths(doc, domElement, piece.GetInternalPaths());
AddPiece *addDet = new AddPiece(domElement, doc, piece, m_drawName);
connect(addDet, &AddPiece::NeedFullParsing, doc, &VAbstractPattern::NeedFullParsing);
@ -393,6 +412,7 @@ void VToolSeamAllowance::RefreshDataInFile()
AddGrainline(doc, domElement, piece);
AddNodes(doc, domElement, piece);
AddCSARecords(doc, domElement, piece.GetCustomSARecords());
AddInternalPaths(doc, domElement, piece.GetInternalPaths());
}
}
}
@ -637,6 +657,7 @@ VToolSeamAllowance::VToolSeamAllowance(VAbstractPattern *doc, VContainer *data,
VPiece detail = data->GetPiece(id);
InitNodes(detail, scene);
InitCSAPaths(detail);
InitInternalPaths(detail);
this->setFlag(QGraphicsItem::ItemIsMovable, true);
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
RefreshGeometry();
@ -737,6 +758,22 @@ void VToolSeamAllowance::InitCSAPaths(const VPiece &detail)
}
}
//---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::InitInternalPaths(const VPiece &detail)
{
QVector<quint32> records = detail.GetInternalPaths();
for (int i = 0; i < records.size(); ++i)
{
QHash<quint32, VDataTool*>* tools = doc->getTools();
SCASSERT(tools != nullptr);
VToolPiecePath *tool = qobject_cast<VToolPiecePath*>(tools->value(records.at(i)));
SCASSERT(tool != nullptr);
tool->setParentItem(this);
tool->SetParentType(ParentType::Item);
doc->IncrementReferens(records.at(i));
}
}
//---------------------------------------------------------------------------------------------------------------------
void VToolSeamAllowance::DeleteTool(bool ask)
{

View File

@ -56,6 +56,7 @@ public:
static const QString TagCSA;
static const QString TagRecord;
static const QString TagIPaths;
static const QString AttrVersion;
static const QString AttrForbidFlipping;
@ -74,6 +75,7 @@ public:
static void AddAttributes(VAbstractPattern *doc, QDomElement &domElement, quint32 id, const VPiece &piece);
static void AddCSARecord(VAbstractPattern *doc, QDomElement &domElement, const CustomSARecord &record);
static void AddCSARecords(VAbstractPattern *doc, QDomElement &domElement, const QVector<CustomSARecord> &records);
static void AddInternalPaths(VAbstractPattern *doc, QDomElement &domElement, const QVector<quint32> &paths);
static void AddPatternPieceData(VAbstractPattern *doc, QDomElement &domElement, const VPiece &piece);
static void AddPatternInfo(VAbstractPattern *doc, QDomElement &domElement, const VPiece &piece);
static void AddGrainline(VAbstractPattern *doc, QDomElement &domElement, const VPiece &piece);
@ -131,6 +133,7 @@ private:
void InitNodes(const VPiece &detail, VMainGraphicsScene *scene);
void InitCSAPaths(const VPiece &detail);
void InitInternalPaths(const VPiece &detail);
template <typename Tool>
Tool* InitTool(VMainGraphicsScene *scene, quint32 toolId);

View File

@ -64,6 +64,7 @@ void AddPiece::undo()
DecrementReferences(m_detail.GetPath().GetNodes());
DecrementReferences(m_detail.GetCustomSARecords());
DecrementReferences(m_detail.GetInternalPaths());
}
else
{

View File

@ -108,6 +108,7 @@ void DeletePiece::redo()
DecrementReferences(m_detail.GetPath().GetNodes());
DecrementReferences(m_detail.GetCustomSARecords());
DecrementReferences(m_detail.GetInternalPaths());
emit NeedFullParsing(); // Doesn't work when UnionDetail delete detail.
}
else

View File

@ -77,9 +77,11 @@ void SavePieceOptions::undo()
VToolSeamAllowance::AddGrainline(doc, domElement, m_oldDet);
VToolSeamAllowance::AddNodes(doc, domElement, m_oldDet);
VToolSeamAllowance::AddCSARecords(doc, domElement, m_oldDet.GetCustomSARecords());
VToolSeamAllowance::AddInternalPaths(doc, domElement, m_oldDet.GetInternalPaths());
IncrementReferences(m_oldDet.MissingNodes(m_newDet));
IncrementReferences(m_oldDet.MissingCSAPath(m_newDet));
IncrementReferences(m_oldDet.MissingInternalPaths(m_newDet));
emit NeedLiteParsing(Document::LiteParse);
}
else
@ -104,9 +106,11 @@ void SavePieceOptions::redo()
VToolSeamAllowance::AddGrainline(doc, domElement, m_newDet);
VToolSeamAllowance::AddNodes(doc, domElement, m_newDet);
VToolSeamAllowance::AddCSARecords(doc, domElement, m_newDet.GetCustomSARecords());
VToolSeamAllowance::AddInternalPaths(doc, domElement, m_newDet.GetInternalPaths());
DecrementReferences(m_oldDet.MissingNodes(m_newDet));
DecrementReferences(m_oldDet.MissingCSAPath(m_newDet));
DecrementReferences(m_oldDet.MissingInternalPaths(m_newDet));
emit NeedLiteParsing(Document::LiteParse);
}