{"id":463741,"date":"2025-06-19T03:00:11","date_gmt":"2025-06-19T03:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=463741"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=463741","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0430\u0434\u0434\u043e\u043d \u0434\u043b\u044f Fusion 360<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0421\u0410\u041f\u0420 Fusion 360.<\/p>\n<p>\u0425\u043e\u0442\u044c Autodesk \u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0420\u0424, \u0441\u0430\u043c Fusion 360 \u0432\u043f\u043e\u043b\u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442, \u0434\u0430 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e \u0445\u043e\u0431\u0431\u0438\u0439\u043d\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438: \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u044f, \u043a\u0440\u043e\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0435\u0449\u0435 \u0438 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u043e\u0439 \u0438 3-\u0434 \u043f\u0435\u0447\u0430\u0442\u044c\u044e. \u0410 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435\u0442 100500 \u0434\u0435\u043d\u0435\u0433 \u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u043e\u043f\u0440\u0438\u0432\u043e\u0434\u044b, \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u043e\u0432. \u0418 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0442\u043e\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u0437\u0435\u043b\u043e \u043d\u0435\u0434\u0435\u0448\u0435\u0432\u044b\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0441\u0435 \u0445\u043e\u0431\u0431\u0438\u0439\u0449\u0438\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043b\u0438\u0431\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u044b\u0435, \u043b\u0438\u0431\u043e \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0435 &#8212; \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 3-\u0434 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0435. \u041d\u043e, \u043c\u043d\u0435 \u043a\u0430\u043a-\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043f\u043e\u043f\u0430\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430 &#8212; \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u043b\u0430\u043c\u0438 \u043a\u0430\u0447\u0435\u043d\u0438\u044f (\u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0412\u041f\u0422\u041a). \u0422\u0430\u043a \u0432\u043e\u0442, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u043d\u044b\u0445 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u0434\u0434\u043e\u043d\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0444\u044c\u044e\u0436\u0435\u043d\u0430, \u0442\u043e \u0434\u043b\u044f \u0412\u041f\u0422\u041a \u0442\u0430\u043a\u0438\u0445 \u043d\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c, \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u044b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 dxf. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u044b \u0438 \u0445\u0432\u0430\u0442\u0438\u043b\u043e, \u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0447\u0435\u0433\u043e, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0434\u0434\u043e\u043d \u0434\u043b\u044f Fusion 360, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u0442\u0440\u043e\u0438\u043b \u044d\u0442\u043e\u0442 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<h3>\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0434\u043e\u043d<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 UTILITIES \u0438 \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043c \u0438\u043a\u043e\u043d\u043a\u0443 &#171;scripts and add-ins&#187;, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u0435 \u043d\u0430\u0436\u0430\u0442\u044c, \u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pf\/w4\/y4\/pfw4y4m2wpzx-ym8yeqctdyjak8.png\" alt=\"\u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/pf\/w4\/y4\/pfw4y4m2wpzx-ym8yeqctdyjak8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/pf\/w4\/y4\/pfw4y4m2wpzx-ym8yeqctdyjak8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p> \u0433\u0434\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c &#171;create script or addin&#187;. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yl\/42\/l0\/yl42l0ete7h20yyimjtfner0ane.png\" alt=\"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0434\u043e\u043d\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/yl\/42\/l0\/yl42l0ete7h20yyimjtfner0ane.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/yl\/42\/l0\/yl42l0ete7h20yyimjtfner0ane.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0434\u043e\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p> \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0447\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435. Fusion \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sa\/e1\/vr\/sae1vr-ymc2pghnloehlhcbv0fg.png\" alt=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/sa\/e1\/vr\/sae1vr-ymc2pghnloehlhcbv0fg.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/sa\/e1\/vr\/sae1vr-ymc2pghnloehlhcbv0fg.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p> \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0432\u043e\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 IDE (\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b PyCahrm). \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0441 \u0443\u0447\u0435\u0431\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u043c\u0435\u043d\u0434\u044b (\u044f \u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043b createWaveDrive). \u0421\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u044b <strong>init.py<\/strong>, <strong>entry.py<\/strong> \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 <strong>resources<\/strong> \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 commandDialog. \u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u0434\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b <strong>init.py<\/strong> \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <strong>commands<\/strong> \u0443\u0431\u0440\u0430\u0432 \u043b\u0438\u0448\u043d\u0438\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u0432\u043e\u0439: <\/p>\n<pre><code class=\"python\">#\u044d\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c: from .commandDialog import entry as commandDialog from .paletteShow import entry as paletteShow from .paletteSend import entry as paletteSend #\u0430 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c: from .createWaveDrive import entry as createWaveDrive commands = [ #\u0438 \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c:     commandDialog,     paletteShow,     paletteSend #\u0430 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c: createWaveDrive ] <\/code><\/pre>\n<p>\u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439: <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/mo\/xc\/se\/moxcseo-q9y2afqfethc9maoq80.png\" alt=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/mo\/xc\/se\/moxcseo-q9y2afqfethc9maoq80.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/mo\/xc\/se\/moxcseo-q9y2afqfethc9maoq80.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0428\u0430\u0433 \u0432\u0442\u043e\u0440\u043e\u0439. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0442\u0440\u0435\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0434\u0434\u043e\u043d\u0430: \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u0430\u043c \u0434\u0438\u0430\u043b\u043e\u0433. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b entry.py.<br \/> \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u043e\u0434 \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\">CMD_ID = f'{config.COMPANY_NAME}_{config.ADDIN_NAME}_waveDriveDialog' CMD_NAME = 'Wave Drive Creation Dialog' CMD_Description = 'Create wave drive with roller elements' <\/code><\/pre>\n<p>\u0418 \u0443\u0434\u0430\u043b\u0438\u043c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 command_created, command_execute, command_input_changed, command_validate_input:<\/p>\n<pre><code class=\"python\">def command_created(args: adsk.core.CommandCreatedEventArgs):     pass def command_execute(args: adsk.core.CommandEventArgs):     pass def command_input_changed(args: adsk.core.InputChangedEventArgs):     pass def command_validate_input(args: adsk.core.ValidateInputsEventArgs): pass <\/code><\/pre>\n<p>\u041e\u043d\u0438 \u043d\u0430\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044e command_destroy \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c &#8212; \u0435\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<br \/> \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e start (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043d\u0435\u0439 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430):<br \/> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0430 \u0430\u0434\u0434\u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;scripts and addins&#187;, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0435\u0435 \u043d\u0430 \u0441\u0432\u043e\u044e \u043b\u0438\u0447\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c.<br \/> \u0432\u043c\u0435\u0441\u0442\u043e<\/p>\n<pre><code class=\"python\">    panel = workspace.toolbarPanels.itemById(PANEL_ID) <\/code><\/pre>\n<p>\u043d\u0430\u043f\u0438\u0448\u0435\u043c<\/p>\n<pre><code class=\"python\">    panels = workspace.toolbarPanels     panel = panels.itemById(PANEL_ID)     if panel:         panel.deleteMe()     panel = panels.add(PANEL_ID, 'ROLLER WAVE DRIVE', 'SelectPanel', False) <\/code><\/pre>\n<p>\u041f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 resources, \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0438\u0445 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043f\u0440\u0430\u0432\u0430. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wi\/cw\/--\/wicw--brj1vwsdf9oqleqydd5s4.png\" alt=\"\u043f\u0430\u043d\u0435\u043b\u044c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430 \u043d\u0435\u0439\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/wi\/cw\/--\/wicw--brj1vwsdf9oqleqydd5s4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/wi\/cw\/--\/wicw--brj1vwsdf9oqleqydd5s4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u043f\u0430\u043d\u0435\u043b\u044c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430 \u043d\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p> \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430: <\/p>\n<pre><code class=\"python\">ID_ROLLER_DIAMETER = 'roller_diameter' ID_ROLLERS_NUMBER = 'rollers_number' ID_USE_BALLS = 'use_balls' ID_ROLLER_HEIGHT = 'roller_height' ID_USE_MINIMAL_DIAMETER = 'use_minimal_diameter' ID_CYCLOID_DIAMETER = 'cycloid_diameter' ID_INPUT_SHAFT_DIAMETER = 'input_shaft_diameter' ID_INPUT_PLANE = 'input_plane' ID_ROLLER_TOLERANCE = 'roller_tolerance' ID_BODY_DIAMETER = 'body_diameter' ID_BEARING_OUTER_DIAMETER = 'bearing_outer_diameter' ID_BEARING_INNER_DIAMETER = 'bearing_inner_diameter' ID_BEARING_HEIGHT = 'bearing_height' <\/code><\/pre>\n<p>\u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 command_created \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u0438\u0430\u043b\u043e\u0433:<\/p>\n<pre><code class=\"python\">#\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0434\u043b\u0438\u043d\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 'cm', 'mm', 'in' len_units = app.activeProduct.unitsManager.defaultLengthUnits #\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f     inputs = args.command.commandInputs      # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433 # \u0421\u0432\u0435\u0440\u0445\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438     inputs.addImageCommandInput('image', '', 'commands\/createWaveDrive\/resources\/diagram.png') # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 6     inputs.addValueInput(ID_ROLLER_DIAMETER, 'Roller diameter', len_units, adsk.core.ValueInput.createByString('6')) # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0430 \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430     inputs.addIntegerSpinnerCommandInput(ID_ROLLERS_NUMBER, 'Rollers number', 5, 100, 1, 17) # \u0427\u0435\u043a\u0431\u043e\u043a\u0441     inputs.addBoolValueInput(ID_USE_BALLS, 'Use balls', True, '', False)     inputs.addValueInput(ID_ROLLER_HEIGHT, 'Roller height', len_units, adsk.core.ValueInput.createByString('6'))     inputs.addBoolValueInput(ID_USE_MINIMAL_DIAMETER, 'Use minimal cycloid diameter', True, '', False)     inputs.addValueInput(ID_CYCLOID_DIAMETER, 'Cycloid outer diameter', len_units, adsk.core.ValueInput.createByString('75'))     inputs.addValueInput(ID_BODY_DIAMETER, 'Body diameter', len_units, adsk.core.ValueInput.createByString('80'))     inputs.addValueInput(ID_INPUT_SHAFT_DIAMETER, 'Input shaft diameter', len_units, adsk.core.ValueInput.createByString('5'))     inputs.addValueInput(ID_ROLLER_TOLERANCE, 'Rollers tolerance', len_units, adsk.core.ValueInput.createByString('0.1'))     inputs.addValueInput(ID_BEARING_OUTER_DIAMETER, 'Bearing outer diameter', len_units, adsk.core.ValueInput.createByString('21'))     inputs.addValueInput(ID_BEARING_INNER_DIAMETER, 'Bearing inner diameter', len_units, adsk.core.ValueInput.createByString('12'))     inputs.addValueInput(ID_BEARING_HEIGHT, 'Bearing height', len_units, adsk.core.ValueInput.createByString('5'))  # \u041f\u0438\u043a\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u0444\u0438\u043b\u044c\u0442\u0440\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043b\u043e\u0441\u043a\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 # \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u043d\u0430 \u043b\u044e\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438     plane_select = inputs.addSelectionInput(ID_INPUT_PLANE, 'Input plane', 'select a plane')     plane_select.addSelectionFilter(adsk.core.SelectionCommandInput.PlanarFaces)     plane_select.addSelectionFilter(adsk.core.SelectionCommandInput.ConstructionPlanes)     plane_select.setSelectionLimits(1, 1)  # \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u0438\u0430\u0442\u0442\u0430\u0447\u0438\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u0430     futil.add_handler(args.command.execute, command_execute, local_handlers=local_handlers)     futil.add_handler(args.command.inputChanged, command_input_changed, local_handlers=local_handlers)     futil.add_handler(args.command.validateInputs, command_validate_input, local_handlers=local_handlers)     futil.add_handler(args.command.destroy, command_destroy, local_handlers=local_handlers) <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u0434\u0434\u043e\u043d \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pa\/tg\/bf\/patgbf93z7bkcjtxvjwyc67asdc.png\" alt=\"\u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/pa\/tg\/bf\/patgbf93z7bkcjtxvjwyc67asdc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/pa\/tg\/bf\/patgbf93z7bkcjtxvjwyc67asdc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p> \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u043c &#8212; \u043e\u043d\u0430 \u0438 \u0442\u0430\u043a \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f. \u0422\u0430\u043a, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e&#8230;. <\/p>\n<h3>\u0428\u0430\u0433 \u0442\u0440\u0435\u0442\u0438\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431 \u043d\u0435 \u043a\u0438\u0434\u0430\u0442\u044c\u0441\u044f \u043a\u0443\u0447\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0414\u0422\u041e \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"python\">class RollerWaveDriveParams:     RESOLUTION = 8     ECCENTRICITY = 0.2      def __init__(self, roller_diameter: float, rollers_number: int, use_balls: bool, roller_height: float,                  use_minimal_diameter: bool, cycloid_diameter: float, shaft_diameter: float, roller_tolerance: float,                  body_diameter: float, bearing_outer_diameter: float, bearing_inner_diameter: float,                  bearing_height: float):         self.roller_diameter = roller_diameter         self.roller_number = rollers_number         self.use_balls = use_balls         self._roller_height = roller_height         self.use_minimal_diameter = use_minimal_diameter         self.cycloid_diameter = cycloid_diameter         self.shaft_diameter = shaft_diameter         self.roller_tolerance = roller_tolerance         self._body_diameter = body_diameter         self.bearing_outer_diameter = bearing_outer_diameter         self.bearing_inner_diameter = bearing_inner_diameter         self.bearing_height = bearing_height <\/code><\/pre>\n<p>\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0435\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 DTO \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0435\u0439 \u0434\u0438\u0430\u043b\u043e\u0433\u0430<\/p>\n<pre><code class=\"python\">def get_params_from_inputs(inputs: adsk.core.CommandInputs) -&gt; RollerWaveDriveParams: #\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u043e \u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c     roller_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_ROLLER_DIAMETER)     rollers_number_input: adsk.core.IntegerSpinnerCommandInput = inputs.itemById(ID_ROLLERS_NUMBER)     use_balls_input: adsk.core.BoolValueCommandInput = inputs.itemById(ID_USE_BALLS)     roller_height_input: adsk.core.ValueCommandInput = inputs.itemById(ID_ROLLER_HEIGHT)     use_minimal_diameter_input: adsk.core.BoolValueCommandInput = inputs.itemById(ID_USE_MINIMAL_DIAMETER)     cycloid_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_CYCLOID_DIAMETER)     shaft_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_INPUT_SHAFT_DIAMETER)     rollers_tolerance_input: adsk.core.ValueCommandInput = inputs.itemById(ID_ROLLER_TOLERANCE)     bearing_outer_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_BEARING_OUTER_DIAMETER)     bearing_inner_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_BEARING_INNER_DIAMETER)     bearing_height_input: adsk.core.ValueCommandInput = inputs.itemById(ID_BEARING_HEIGHT)     body_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_BODY_DIAMETER)  #\u0418 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440     return RollerWaveDriveParams(         roller_diameter_input.value,         rollers_number_input.value,         use_balls_input.value,         roller_height_input.value,         use_minimal_diameter_input.value,         cycloid_diameter_input.value,         shaft_diameter_input.value,         rollers_tolerance_input.value,         body_diameter_input.value,         bearing_outer_diameter_input.value,         bearing_inner_diameter_input.value,         bearing_height_input.value     ) <\/code><\/pre>\n<h3>\u0428\u0430\u0433 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439. \u0420\u0438\u0441\u0443\u0435\u043c \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 &#8212; \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443. \u0418\u0434\u0435\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e command_execute, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0435\u0435:<\/p>\n<pre><code class=\"python\">def command_execute(args: adsk.core.CommandEventArgs): #\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b \u0434\u0438\u0430\u043b\u043e\u0433\u0430     inputs = args.command.commandInputs #\u0438 \u043d\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0437\u0430\u0439\u043d\u0430     root = design.rootComponent      #\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0435\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438     params = get_params_from_inputs(inputs)  #\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430     plane_input: adsk.core.SelectionCommandInput = inputs.itemById(ID_INPUT_PLANE)     plane: ConstructionPlane = plane_input.selection(0).entity  #\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u044f\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c #\u043d\u043e \u043c\u043d\u0435 \u0442\u0430\u043a \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e.     component = root.occurrences.addNewComponent(adsk.core.Matrix3D.create()).component #\u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c     component.name = 'RollerWaveDrive-1-to-{}'.format(params.roller_number)  #\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d\u0430     start_index = design.timeline.count - 1       #\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0443 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430     draw_gear(params, component, plane) #\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440     draw_separator(params, component, plane) #\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u044d\u043a\u0441\u0446\u0435\u043d\u0442\u0440\u0438\u043a     draw_cam(params, component, plane) #\u0418, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0440\u0438\u043a\u0438\"     if params.use_balls:     #\u0422\u043e \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0448\u0430\u0440\u0438\u043a\u0438         draw_balls(params, component, plane)     else: #\u0410 \u0438\u043d\u0430\u0447\u0435 \u0440\u043e\u043b\u0438\u043a\u0438         draw_rollers(params, component, plane)  #\u0412\u0441\u0435 \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u0435\u0440\u043d\u0435\u043c \u043d\u0430 \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443, \u0447\u0442\u043e\u0431 \u043d\u0435 \u0437\u0430\u0445\u043b\u0430\u043c\u043b\u044f\u0442\u044c \u0435\u0433\u043e     design.timeline.timelineGroups.add(start_index, design.timeline.count - 1) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u0435\u0439 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e &#8212; \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u044b.<\/p>\n<pre><code class=\"python\">def draw_gear(params: RollerWaveDriveParams, component: Component, plane: ConstructionPlane):     #\u0427\u0438\u0441\u043b\u043e \u0432\u043f\u0430\u0434\u0438\u043d \u043d\u0430 \u043e\u0431\u043e\u0434\u0435     num_dimples = params.roller_number + 1     #\u0420\u0430\u0434\u0438\u0443\u0441 \u0448\u0430\u0440\u0438\u043a\u0430     ball_radius = params.roller_diameter \/ 2     eccentricity = params.eccentricity      #\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0435\u0442\u0447 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438     profile_sketch = component.sketches.add(plane)     profile_sketch.name = 'Wheel'     #\u0418 \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0434\u043b\u044f \u0441\u043f\u043b\u0430\u0439\u043d\u0430 \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u044b     points = adsk.core.ObjectCollection.create()      for i in range(params.resolution):         theta = math.pi * 2.0 * i \/ params.resolution         S = math.sqrt(             (ball_radius + params.cam_radius) ** 2 - math.pow(eccentricity * math.sin(num_dimples * theta), 2))         l = eccentricity * math.cos(num_dimples * theta) + S         xi = math.atan2(eccentricity * num_dimples * math.sin(num_dimples * theta), S)          x = l * math.sin(theta) + ball_radius * math.sin(theta + xi)         y = l * math.cos(theta) + ball_radius * math.cos(theta + xi)          #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u044b \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e         point = adsk.core.Point3D.create(x, y, 0)         points.add(point)     #\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0438\u0432\u0430\u044f \u0432\u044b\u0448\u043b\u0430 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0439     points.add(points[0])      #\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u043b\u0430\u0439\u043d \u0438\u0437 \u0442\u043e\u0447\u0435\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0433\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u043c     profile_spline = profile_sketch.sketchCurves.sketchFittedSplines.add(points)     profile_spline.isClosed = True      #\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043b\u0435\u0441\u0430     profile_sketch.sketchCurves.sketchCircles.addByCenterRadius(adsk.core.Point3D.create(0, 0, 0),                                                                 params.body_diameter)      #\u0431\u0435\u0440\u0435\u043c \u0444\u0438\u0447\u0438 \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f     extrudes = component.features.extrudeFeatures     #\u0432\u0437\u044c\u043c\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043a\u0435\u0442\u0447\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f     prof = profile_sketch.profiles.item(0)     #\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f     distance = adsk.core.ValueInput.createByReal(get_extrusion_height(params))     #\u0438 \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 - \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430     disk_extrude = extrudes.addSimple(prof, distance, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)     disk_extrude.bodies.item(0).name = \"CycloidWheel\" <\/code><\/pre>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f\/\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f &#8212; \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u043e\u043d\u0438 \u043d\u0443\u043c\u0435\u0440\u0443\u044e\u0442\u0441\u044f, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a. \u0411\u043b\u0430\u0433\u043e \u0442\u0443\u0442 \u0432\u0441\u0435\u0433\u043e 2 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442\u044b \u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 &#8212; \u0431\u0435\u0440\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0448\u0430\u0440\u0438\u043a\u0430\/\u0440\u043e\u043b\u0438\u043a\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043b\u043b\u0438\u043c\u0435\u0442\u0440\u043e\u0432 &#171;\u043f\u0440\u043e \u0437\u0430\u043f\u0430\u0441&#187;<\/p>\n<pre><code class=\"python\">def get_extrusion_height(params: RollerWaveDriveParams) -&gt; float:     return params.roller_height + 2 * params.roller_tolerance + 0.2 <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">def draw_separator(params: RollerWaveDriveParams, component: Component, plane: ConstructionPlane):     #\u0421\u043d\u043e\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043a\u0435\u0442\u0447     sketch = component.sketches.add(plane)     sketch.name = 'Separator'     #\u0418 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c 2 \u043a\u0440\u0443\u0433\u0430 - \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u044e\u044e \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430     sketch.sketchCurves.sketchCircles.addByCenterRadius(adsk.core.Point3D.create(0, 0, 0),                                                         params.separator_inner_radius)     sketch.sketchCurves.sketchCircles.addByCenterRadius(adsk.core.Point3D.create(0, 0, 0),                                                         params.separator_outer_radius)      #\u0412\u044b\u0434\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437     extrudes = component.features.extrudeFeatures     prof = sketch.profiles.item(1)     distance = adsk.core.ValueInput.createByReal(get_extrusion_height(params))     separator_extrude = extrudes.addSimple(prof, distance, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)     #\u0418 \u0441\u043e\u0445\u0440\u043d\u0438\u043c \u0442\u0435\u043b\u043e \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430, \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0435\u043c\u0443 \u0438\u043c\u044f     separator_body = separator_extrude.bodies.item(0)     separator_body.name = \"Separator\"      #\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043e\u0441\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430     axis = create_axis_from_cylindrical_body(component, separator_body)     #\u041f\u0440\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0435 \u043f\u043e\u0434 \u0448\u0430\u0440\u0438\u043a \u0438\u043b\u0438 \u0440\u043e\u043b\u0438\u043a     hole_feature = create_round_hole(params, component, plane) if params.use_balls else create_square_hole(params, component, plane)     #\u0420\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0435 \u043f\u043e \u043a\u0440\u0443\u0433\u0443     create_circular_pattern(axis, hole_feature, params.roller_number) <\/code><\/pre>\n<p>\u041e\u0441\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a construction axis \u043f\u043e \u0446\u0438\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440 \u0443 \u043d\u0430\u0441 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0445 \u0438\u043c\u0435\u0435\u0442 \u0430\u0436 2 \u0448\u0442\u0443\u043a\u0438.<\/p>\n<pre><code class=\"python\">def create_axis_from_cylindrical_body(component: Component, separator_body: BRepBody) -&gt; ConstructionAxis:     axis_input = component.constructionAxes.createInput()     axis_input.setByCircularFace(find_cylindrical_face(separator_body))     axis = component.constructionAxes.add(axis_input)     return axis  #\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0446\u0438\u043b\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0435\u0439\u0441 def find_cylindrical_face(body: BRepBody) -&gt; BRepFace:     for face in body.faces:         geom = face.geometry         if geom.surfaceType == adsk.core.SurfaceTypes.CylinderSurfaceType:             return face <\/code><\/pre>\n<p>\u041e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0435 \u043f\u043e\u0434 \u0440\u043e\u043b\u0438\u043a (\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u043e\u043b\u0438\u043a, \u0448\u0430\u0440\u0438\u043a \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043a\u043e\u0434\u0435)<\/p>\n<pre><code class=\"python\">def create_square_hole(params: RollerWaveDriveParams, component: Component, plane: ConstructionPlane) -&gt; Feature:     extrudes = component.features.extrudeFeatures     planes = component.constructionPlanes     #\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f     plane_input = planes.createInput()     #\u0414\u0435\u043b\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e, \u043d\u0430 \u0442\u043e\u043b\u0449\u0438\u043d\u0443 \"\u043a\u0440\u044b\u0448\u043a\u0438\" \u0441\u0435\u043f\u0430\u0440\u0430\u0442\u043e\u0440\u0430, 1\u043c\u043c     plane_input.setByOffset(plane, adsk.core.ValueInput.createByReal(0.1))     holes_plane = planes.add(plane_input)     #\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u044d\u0442\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0435\u0442\u0447     holes_sketch = component.sketches.add(holes_plane)     holes_sketch.name = 'RollerHole'     #\u041d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u043d\u0438\u043a, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0440\u043e\u043b\u0438\u043a + \u0437\u0430\u043f\u0430\u0441     holes_sketch.sketchCurves.sketchLines.addCenterPointRectangle(         adsk.core.Point3D.create(0, params.separator_middle_radius, 0),         adsk.core.Point3D.create(params.roller_diameter \/ 2 + params.roller_tolerance,                                  params.separator_middle_radius + params.separator_thickness, 0),     )     prof = holes_sketch.profiles.item(0)     distance = adsk.core.ValueInput.createByReal(params.roller_height + 2 * params.roller_tolerance)     #\u0412\u044b\u0434\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u043d\u0438\u043a\u0430, \u043d\u043e \u043d\u0435 \u043a\u0430\u043a \u043d\u043e\u0432\u043e\u0435 \u0442\u0435\u043b\u043e, \u0430 \u043a\u0430\u043a \"\u0432\u044b\u0440\u0435\u0437\"     hole_extrude = extrudes.addSimple(prof, distance, adsk.fusion.FeatureOperations.CutFeatureOperation)     return hole_extrude <\/code><\/pre>\n<p>\u0418 \u043d\u0430\u0434\u043e \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043f\u043e \u043a\u0440\u0443\u0433\u0443 (circular pattern) \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438<\/p>\n<pre><code class=\"python\">def create_circular_pattern(axis: ConstructionAxis, feature: Feature, num_copies: int):     #\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043b\u0435\u043b\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u0447     collection = adsk.core.ObjectCollection.create()     collection.add(feature)     #\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439 \u0438 \u0443\u0433\u043e\u043b.     pattern_features = feature.parentComponent.features.circularPatternFeatures     pattern_input = pattern_features.createInput(collection, axis)     pattern_input.quantity = adsk.core.ValueInput.createByReal(num_copies)     #\u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a  adsk.core.ValueInput.createByReal(2 * pi)     pattern_input.totalAngle = adsk.core.ValueInput.createByString('360 deg')     pattern_input.isSymmetric = False     #\u0441\u0442\u0440\u043e\u0438\u043c \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d     pattern_features.add(pattern_input) <\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u044d\u043a\u0441\u0446\u0435\u043d\u0442\u0440\u0438\u043a\u0430 \u0438 \u0448\u0430\u0440\u0438\u043a\u043e\u0432\/\u0440\u043e\u043b\u0438\u043a\u043e\u0432 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0432\u0435\u0440\u0445 \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435.<\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u043d\u044c\u043a\u0438\u0439 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/h0\/so\/ll\/h0soll1vwhhpzyskih0qtxabetm.png\" alt=\"\u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u0432 \u0438\u043d\u0442\u0440\u0435\u0444\u0435\u0439\u0441\u0435 Fusion 360\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/h0\/so\/ll\/h0soll1vwhhpzyskih0qtxabetm.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/h0\/so\/ll\/h0soll1vwhhpzyskih0qtxabetm.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u0432 \u0438\u043d\u0442\u0440\u0435\u0444\u0435\u0439\u0441\u0435 Fusion 360<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0445\u0443\u0436\u0435 \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e: \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u043c\u0435\u043d\u044f \u043f\u043e\u0434\u043a\u0443\u043f\u0438\u043b &#171;\u043a\u0440\u0443\u0433\u043b\u044b\u043c&#187; \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u0437\u0432\u0435\u043d\u043e\u043c, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0435\u043c \u043f\u0430\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u043c\u0443\u0444\u0442\u044b \u0438\u043b\u0438 \u043c\u0443\u0444\u0442\u044b \u041e\u043b\u0434\u0435\u043c\u0430, \u043a\u0430\u043a \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0439. \u041d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0435\u0433\u043e \u043f\u043b\u044e\u0441\u044b, \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f: \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u0437\u0434\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043e\u0431\u043e\u0440\u043e\u0442\u0430\u0445, \u0438 \u0438\u043c\u0435\u0435\u0442 \u044f\u0432\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u0438\u0439 \u041a\u041f\u0414.<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/oncenweek\/fusion-360-wave-drive-with-rolles-addin\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/codeberg.org\/TrashRobotics\/BallsWaveGearingGenerator\/src\/branch\/main\/calc_vptc.py\" rel=\"noopener noreferrer nofollow\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/cyberleninka.ru\/article\/n\/geometricheskie-i-konstruktivnye-sootnosheniya-v-volnovyh-peredachah-s-promezhutochnymi-telami-kacheniya\/viewer\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u044c\u044f, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u0432\u0438\u0434\u0438\u043c\u043e, \u0441\u0434\u0435\u043b\u0430\u043d \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/835260\/\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043e \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/919478\/\"> https:\/\/habr.com\/ru\/articles\/919478\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0421\u0410\u041f\u0420 Fusion 360.<\/p>\n<p>\u0425\u043e\u0442\u044c Autodesk \u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0420\u0424, \u0441\u0430\u043c Fusion 360 \u0432\u043f\u043e\u043b\u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442, \u0434\u0430 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e \u0445\u043e\u0431\u0431\u0438\u0439\u043d\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u0439\u0434\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438: \u0443\u0432\u043b\u0435\u043a\u0430\u044e\u0441\u044c \u044f, \u043a\u0440\u043e\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0435\u0449\u0435 \u0438 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u043e\u0439 \u0438 3-\u0434 \u043f\u0435\u0447\u0430\u0442\u044c\u044e. \u0410 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435\u0442 100500 \u0434\u0435\u043d\u0435\u0433 \u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u043e\u043f\u0440\u0438\u0432\u043e\u0434\u044b, \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u043e\u0432. \u0418 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u044b \u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0442\u043e\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u0437\u0435\u043b\u043e \u043d\u0435\u0434\u0435\u0448\u0435\u0432\u044b\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0441\u0435 \u0445\u043e\u0431\u0431\u0438\u0439\u0449\u0438\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043b\u0438\u0431\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u044b\u0435, \u043b\u0438\u0431\u043e \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0435 &#8212; \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430 3-\u0434 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0435. \u041d\u043e, \u043c\u043d\u0435 \u043a\u0430\u043a-\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043f\u043e\u043f\u0430\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430 &#8212; \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u043b\u0430\u043c\u0438 \u043a\u0430\u0447\u0435\u043d\u0438\u044f (\u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0412\u041f\u0422\u041a). \u0422\u0430\u043a \u0432\u043e\u0442, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u043d\u044b\u0445 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u0434\u0434\u043e\u043d\u043e\u0432 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0444\u044c\u044e\u0436\u0435\u043d\u0430, \u0442\u043e \u0434\u043b\u044f \u0412\u041f\u0422\u041a \u0442\u0430\u043a\u0438\u0445 \u043d\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c, \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0446\u0438\u043a\u043b\u043e\u0438\u0434\u044b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 dxf. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u044b \u0438 \u0445\u0432\u0430\u0442\u0438\u043b\u043e, \u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u0447\u0435\u0433\u043e, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0434\u0434\u043e\u043d \u0434\u043b\u044f Fusion 360, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u0442\u0440\u043e\u0438\u043b \u044d\u0442\u043e\u0442 \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<h3>\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0434\u043e\u043d<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 UTILITIES \u0438 \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043c \u0438\u043a\u043e\u043d\u043a\u0443 &#171;scripts and add-ins&#187;, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u0435 \u043d\u0430\u0436\u0430\u0442\u044c, \u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e: <\/p>\n<figure class=\"\">\n<div><figcaption>\u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p> \u0433\u0434\u0435 \u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c &#171;create script or addin&#187;. <\/p>\n<figure class=\"\">\n<div><figcaption>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0434\u043e\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p> \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0430\u0432\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0447\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435. Fusion \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439: <\/p>\n<figure class=\"\">\n<div><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p> \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0432\u043e\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 IDE (\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b PyCahrm). \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0441 \u0443\u0447\u0435\u0431\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u043c\u0435\u043d\u0434\u044b (\u044f \u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043b createWaveDrive). \u0421\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u044b <strong>init.py<\/strong>, <strong>entry.py<\/strong> \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 <strong>resources<\/strong> \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 commandDialog. \u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u0434\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b <strong>init.py<\/strong> \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <strong>commands<\/strong> \u0443\u0431\u0440\u0430\u0432 \u043b\u0438\u0448\u043d\u0438\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u0432\u043e\u0439: <\/p>\n<pre><code class=\"python\">#\u044d\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c: from .commandDialog import entry as commandDialog from .paletteShow import entry as paletteShow from .paletteSend import entry as paletteSend #\u0430 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c: from .createWaveDrive import entry as createWaveDrive commands = [ #\u0438 \u044d\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c:     commandDialog,     paletteShow,     paletteSend #\u0430 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c: createWaveDrive ] <\/code><\/pre>\n<p>\u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439: <\/p>\n<figure class=\"\">\n<div><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0428\u0430\u0433 \u0432\u0442\u043e\u0440\u043e\u0439. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0442\u0440\u0435\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0434\u0434\u043e\u043d\u0430: \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u0430\u043c \u0434\u0438\u0430\u043b\u043e\u0433. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b entry.py.<br \/> \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u043e\u0434 \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\">CMD_ID = f'{config.COMPANY_NAME}_{config.ADDIN_NAME}_waveDriveDialog' CMD_NAME = 'Wave Drive Creation Dialog' CMD_Description = 'Create wave drive with roller elements' <\/code><\/pre>\n<p>\u0418 \u0443\u0434\u0430\u043b\u0438\u043c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 command_created, command_execute, command_input_changed, command_validate_input:<\/p>\n<pre><code class=\"python\">def command_created(args: adsk.core.CommandCreatedEventArgs):     pass def command_execute(args: adsk.core.CommandEventArgs):     pass def command_input_changed(args: adsk.core.InputChangedEventArgs):     pass def command_validate_input(args: adsk.core.ValidateInputsEventArgs): pass <\/code><\/pre>\n<p>\u041e\u043d\u0438 \u043d\u0430\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044e command_destroy \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c &#8212; \u0435\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<br \/> \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e start (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043d\u0435\u0439 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430):<br \/> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0430 \u0430\u0434\u0434\u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 &#171;scripts and addins&#187;, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0435\u0435 \u043d\u0430 \u0441\u0432\u043e\u044e \u043b\u0438\u0447\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c.<br \/> \u0432\u043c\u0435\u0441\u0442\u043e<\/p>\n<pre><code class=\"python\">    panel = workspace.toolbarPanels.itemById(PANEL_ID) <\/code><\/pre>\n<p>\u043d\u0430\u043f\u0438\u0448\u0435\u043c<\/p>\n<pre><code class=\"python\">    panels = workspace.toolbarPanels     panel = panels.itemById(PANEL_ID)     if panel:         panel.deleteMe()     panel = panels.add(PANEL_ID, 'ROLLER WAVE DRIVE', 'SelectPanel', False) <\/code><\/pre>\n<p>\u041f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 resources, \u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0438\u0445 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043f\u0440\u0430\u0432\u0430. <\/p>\n<figure class=\"\">\n<div><figcaption>\u043f\u0430\u043d\u0435\u043b\u044c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430 \u043d\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p> \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430: <\/p>\n<pre><code class=\"python\">ID_ROLLER_DIAMETER = 'roller_diameter' ID_ROLLERS_NUMBER = 'rollers_number' ID_USE_BALLS = 'use_balls' ID_ROLLER_HEIGHT = 'roller_height' ID_USE_MINIMAL_DIAMETER = 'use_minimal_diameter' ID_CYCLOID_DIAMETER = 'cycloid_diameter' ID_INPUT_SHAFT_DIAMETER = 'input_shaft_diameter' ID_INPUT_PLANE = 'input_plane' ID_ROLLER_TOLERANCE = 'roller_tolerance' ID_BODY_DIAMETER = 'body_diameter' ID_BEARING_OUTER_DIAMETER = 'bearing_outer_diameter' ID_BEARING_INNER_DIAMETER = 'bearing_inner_diameter' ID_BEARING_HEIGHT = 'bearing_height' <\/code><\/pre>\n<p>\u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 command_created \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u0438\u0430\u043b\u043e\u0433:<\/p>\n<pre><code class=\"python\">#\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0434\u043b\u0438\u043d\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 'cm', 'mm', 'in' len_units = app.activeProduct.unitsManager.defaultLengthUnits #\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f     inputs = args.command.commandInputs      # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433 # \u0421\u0432\u0435\u0440\u0445\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438     inputs.addImageCommandInput('image', '', 'commands\/createWaveDrive\/resources\/diagram.png') # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u0447\u0438\u0441\u0435\u043b, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 6     inputs.addValueInput(ID_ROLLER_DIAMETER, 'Roller diameter', len_units, adsk.core.ValueInput.createByString('6')) # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0430 \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430     inputs.addIntegerSpinnerCommandInput(ID_ROLLERS_NUMBER, 'Rollers number', 5, 100, 1, 17) # \u0427\u0435\u043a\u0431\u043e\u043a\u0441     inputs.addBoolValueInput(ID_USE_BALLS, 'Use balls', True, '', False)     inputs.addValueInput(ID_ROLLER_HEIGHT, 'Roller height', len_units, adsk.core.ValueInput.createByString('6'))     inputs.addBoolValueInput(ID_USE_MINIMAL_DIAMETER, 'Use minimal cycloid diameter', True, '', False)     inputs.addValueInput(ID_CYCLOID_DIAMETER, 'Cycloid outer diameter', len_units, adsk.core.ValueInput.createByString('75'))     inputs.addValueInput(ID_BODY_DIAMETER, 'Body diameter', len_units, adsk.core.ValueInput.createByString('80'))     inputs.addValueInput(ID_INPUT_SHAFT_DIAMETER, 'Input shaft diameter', len_units, adsk.core.ValueInput.createByString('5'))     inputs.addValueInput(ID_ROLLER_TOLERANCE, 'Rollers tolerance', len_units, adsk.core.ValueInput.createByString('0.1'))     inputs.addValueInput(ID_BEARING_OUTER_DIAMETER, 'Bearing outer diameter', len_units, adsk.core.ValueInput.createByString('21'))     inputs.addValueInput(ID_BEARING_INNER_DIAMETER, 'Bearing inner diameter', len_units, adsk.core.ValueInput.createByString('12'))     inputs.addValueInput(ID_BEARING_HEIGHT, 'Bearing height', len_units, adsk.core.ValueInput.createByString('5'))  # \u041f\u0438\u043a\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u0444\u0438\u043b\u044c\u0442\u0440\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u043b\u043e\u0441\u043a\u0438\u0435 \u0433\u0440\u0430\u043d\u0438 # \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u043d\u0430 \u043b\u044e\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0433\u0440\u0430\u043d\u0438     plane_select = inputs.addSelectionInput(ID_INPUT_PLANE, 'Input plane', 'select a plane')     plane_select.addSelectionFilter(adsk.core.SelectionCommandInput.PlanarFaces)     plane_select.addSelectionFilter(adsk.core.SelectionCommandInput.ConstructionPlanes)     plane_select.setSelectionLimits(1, 1)  # \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u0438\u0430\u0442\u0442\u0430\u0447\u0438\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u044b \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u0430     futil.add_handler(args.command.execute, command_execute, local_handlers=local_handlers)     futil.add_handler(args.command.inputChanged, command_input_changed, local_handlers=local_handlers)     futil.add_handler(args.command.validateInputs, command_validate_input, local_handlers=local_handlers)     futil.add_handler(args.command.destroy, command_destroy, local_handlers=local_handlers) <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u0434\u0434\u043e\u043d \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442. <\/p>\n<figure class=\"\">\n<div><figcaption>\u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0443\u043a\u0442\u043e\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p> \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u043f\u0443\u0441\u0442\u0438\u043c &#8212; \u043e\u043d\u0430 \u0438 \u0442\u0430\u043a \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f. \u0422\u0430\u043a, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e&#8230;. <\/p>\n<h3>\u0428\u0430\u0433 \u0442\u0440\u0435\u0442\u0438\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431 \u043d\u0435 \u043a\u0438\u0434\u0430\u0442\u044c\u0441\u044f \u043a\u0443\u0447\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0414\u0422\u041e \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"python\">class RollerWaveDriveParams:     RESOLUTION = 8     ECCENTRICITY = 0.2      def __init__(self, roller_diameter: float, rollers_number: int, use_balls: bool, roller_height: float,                  use_minimal_diameter: bool, cycloid_diameter: float, shaft_diameter: float, roller_tolerance: float,                  body_diameter: float, bearing_outer_diameter: float, bearing_inner_diameter: float,                  bearing_height: float):         self.roller_diameter = roller_diameter         self.roller_number = rollers_number         self.use_balls = use_balls         self._roller_height = roller_height         self.use_minimal_diameter = use_minimal_diameter         self.cycloid_diameter = cycloid_diameter         self.shaft_diameter = shaft_diameter         self.roller_tolerance = roller_tolerance         self._body_diameter = body_diameter         self.bearing_outer_diameter = bearing_outer_diameter         self.bearing_inner_diameter = bearing_inner_diameter         self.bearing_height = bearing_height <\/code><\/pre>\n<p>\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0435\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 DTO \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0435\u0439 \u0434\u0438\u0430\u043b\u043e\u0433\u0430<\/p>\n<pre><code class=\"python\">def get_params_from_inputs(inputs: adsk.core.CommandInputs) -&gt; RollerWaveDriveParams: #\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u043e \u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c     roller_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_ROLLER_DIAMETER)     rollers_number_input: adsk.core.IntegerSpinnerCommandInput = inputs.itemById(ID_ROLLERS_NUMBER)     use_balls_input: adsk.core.BoolValueCommandInput = inputs.itemById(ID_USE_BALLS)     roller_height_input: adsk.core.ValueCommandInput = inputs.itemById(ID_ROLLER_HEIGHT)     use_minimal_diameter_input: adsk.core.BoolValueCommandInput = inputs.itemById(ID_USE_MINIMAL_DIAMETER)     cycloid_diameter_input: adsk.core.ValueCommandInput = inputs.itemById(ID_CYCLOID_DIAMETER)     shaft_diameter_input: adsk.core.ValueCommandInput =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-463741","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/463741","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=463741"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/463741\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=463741"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=463741"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=463741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}