Last active
July 21, 2024 21:40
-
-
Save mario52a/3ec67a3711202dab69592ce53b938924 to your computer and use it in GitHub Desktop.
This macro easily creates a connection between two objects, an object and a point or between two points (the center of the objects are the starting and ending points of the sweep) can be selected form a configurable ellipse polygon circle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import unicode_literals | |
""" | |
*************************************************************************** | |
* Copyright (c) 2016 2017 2018 2019 2020 2024 <mario52> * | |
* * | |
* This file is a supplement to the FreeCAD CAx development system. * | |
* * | |
* This program is free software; you can redistribute it and/or modify * | |
* it under the terms of the GNU Lesser General Public License (LGPL) * | |
* as published by the Free Software Foundation; either version 2 of * | |
* the License, or (at your option) any later version. * | |
* for detail see the LICENCE text file. * | |
** ** | |
* Use at your own risk. The author assumes no liability for data loss. * | |
* It is advised to backup your data frequently. * | |
* If you do not trust the software do not use it. * | |
** ** | |
* This software is distributed in the hope that it will be useful, * | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
* GNU Library General Public License for more details. * | |
* * | |
* You should have received a copy of the GNU Library General Public * | |
* License along with this macro; if not, write to the Free Software * | |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * | |
* USA * | |
*************************************************************************** | |
* WARNING! All changes in this file will be lost and * | |
* may cause malfunction of the program * | |
*************************************************************************** | |
""" | |
#Macro_Connect_And_Sweep.FCMacro | |
# This macro is based to the microelly2 code see "http://forum.freecadweb.org/viewtopic.php?t=7029#p56746" | |
# | |
#05/04/2019 Py3, 26/06/2019, 23/12/2019 discretize, 2020/01/06 sweep et outils, 2020/01/09 centrage sur face, 2020/02/13 Layout rmu | |
#2020/02/22 try:except Error Dialog, 05/07/2020 icon, 21/07/2024 del WebGui, | |
# | |
#OS: Windows 10 build 19045 #OS: Windows 10 (10.0) #OS: Windows 10 (10.0) | |
#Word size of FreeCAD: 64-bit #Word size of OS: 64-bit #Word size of OS: 64-bit | |
#Version: 0.22.0dev.38079 (Git) #Word size of FreeCAD: 64-bit #Word size of FreeCAD: 64-bit | |
#Build type: Release #Version: 0.19.16993 (Git) #Version: 0.19.18990 (Git) | |
#Branch: main #Build type: Release #Build type: Release | |
#Hash: de508e437d13e7eb35baffceea496fb9107888cb #Branch: master #Branch: master | |
#Python 3.11.9, Qt 5.15.13, Coin 4.0.2, Vtk 9.2.6, OCC 7.7.2#Hash: 5ea062f6699666b2f284f6a52105acf20828b481#Hash: e499f384240196c415f207520bfbcb8df9d1b0d2 | |
#Locale: French/Mars (fr_MA) #Python version: 3.6.8 #Python version: 3.6.8 | |
# #Qt version: 5.12.1 #Qt version: 5.12.1 | |
# #Coin version: 4.0.0a #Coin version: 4.0.0a | |
# #OCC version: 7.3.0 #OCC version: 7.3.0 | |
# | |
# | |
__title__ = "Macro_Connect_And_Sweep" | |
__author__ = "Mario52" | |
__url__ = "http://www.freecadweb.org/index-fr.html" | |
__Wiki__ = "http://www.freecadweb.org/wiki/index.php?title=Macro_Connect_And_Sweep" | |
__version__ = "00.13" | |
__date__ = "2024/07/21" #YYYY/MM/DD | |
__Comment__ = "This macro connect 2 objects (boundingBox center) or one object (boundingBox center) and one point or two points selected one wire selected (straight)" | |
__Help__ = "Start the macro select 2 objects choice the form and validate" | |
# | |
#### Section Icones #### | |
## icon fromTheme by FreeCAD | |
## base64 easyw-fc method | |
## https://forum.freecadweb.org/viewtopic.php?f=9&t=24742&start=100#p363271 | |
import base64 | |
CenterTop_b64=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAACvklEQVRo3u2bT3LaMBTGnzzcoTfqgk7T3sNyI7NLKF2Uku5sAc49GvJn0Rv1FOoCSGVbcq1nSZaJ3oyHUbCt7/30PUk4QPK8EhADFYnvDsuCdrb7vvcm4eWL6hVKWVDIF1V0niuHhuy+UeCd3Tdl1wXrPBmsXOa+oyjp9OAJEFAUae11jFjkFRQl1UIkjLnfqnCemsFTKSIkmMHN2bEqZiHPKYT8A0kM3cfYvZ0phNMaMDm8whO/3+lH8+Wb1EpbDmzCKOff1cDf/3l9v35PHDgVNOfw5ORUZTs0seb1Kpjy3zD9dYE7zXl7YRfaWusGxtxvTfipzHQuz19WYW5VVOBsijVz5krZt0rj6PCaonTiQ4DYB2DJs842AEAixHFixh7lfN0Sw55XtXPkLYjrQ9cXe24DLOfrzvuUPDvmeALXPGeQ8/iH9gg2RYYUKm2qHAAA2PW+s211tQ0ZmkqnDloTGN9mSnCD5jy586mA0w22DuQZHN9m9uD1GbWpRTOnJjAVwOStlCtG+7lcrZXt1Mu1b/n2WjCEwH/AML12SF+utWGuQ5ft9dPXi5nvsLkkEAMdXh9J7XbZRcGLzhviPOwcbnIdpVvviQmROM8L7bzdxx8X4yBsLjMY9J8pYX00bQUhwmlOKOd9eVxKI7bpmYj/o7/rNsrcvCwYfQD6eI6ne643VHsnPIyw7LA0gjOG80wBZ4elMQe082SA+6vN5BYJWXPTDN43yWcxKiHjLBj/h2ZhkywAe2SHW424+nnjLBhtvSpwxxxw+RNKubDjvDuFqJDK1L4+kqbcWlFVn+7any4exoXoUpNVeDqxvkH60mAdXp8EXID03Z9TeCaJYZJzcc8g4ZkmPSR8zrEz4XkTlv66qbXvP/+0ej/w+BXc0b8Z2k5+OhGfJEd4Ed7kYibibx6j80ZxHkC0Hjb+AskPXAE8rckuAAAAAElFTkSuQmCC | |
""" | |
CenterRigth_b64=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAACv0lEQVRo3u2bzXKbMBDHF4Z36BO1h3bq9j0QwuRWu+mhqZNbDEh5j8Rtc+kT5SnUA8aWkfgQSAKDdobxyMar3Z//Wn0w9pKEMnDWy3yHwMGrtf0jamx3/WyR8JIbeoKyf0SQ3FCnPFMKVVHfIuCV6tOpOqc8TnUlWH6Yt1nARl6o7D/+HKaq1x+d763LdZ1QYNw9fLsR3rXBavNXB3OdUO25BFMBpqKgJp/8+6o+JwOvDdjQxKrfl/VnGmQAwDRDu2tI+JavQHpn1AvfYhwlyOp9kso4jvJk4NqDNbQ8OfYrQrzTFpNvClzyejsauLY4mkaH0rAdulRJP4mBrP+OD00WEx9rCbAaqwqPYMrgsgxpBdjqL43GmW2nqDbTFuhQnWlwcUyN+OVz8D682ZkwZMN1ieYvebgOjd2f8nCdOsCADVirMEtHMszi0Y9KX72Hbfzn+3yK1/s3YAyAAYMsiyDLiiVLlmM7O4w5WoxzyHJcCzFwiM7meecdRhUY345x7uCJ9Q4EQCW0sq1lb2vz+H6MRwWMAeQEA46O0JjGmpd//jUfyf17B55XDFuMCWBMAADO4Oq3Z0N+VluSsCk9g0sV/HvLqW939aIbkoM/ZudTBpeTuLENAOAzVhRHlSs6bIXiauKy5V+WSwmsmDhiaRy9lyrRYQtkVfxyZLUTgOo0SrF1vxHKgND4om1sh0FWuxPMuVgJUAYOAMBDKGXDoN1LVLmZJAzVWAldQ4TS06t25UWHjRCALMipgZPFXQXX1O49Ycgu9CICJKt7Y8W+61XGwRt62XSaTFCYFrmFqXTC8MIw1boCpV/qVVcFbGyCsRSDdnhdEjAB0nZ/RuGpJNYnORM+JwlPNekhZqs0HI+k7J73hM/fLtpPXx+0+rN5iDD6YaiY/PWYe4bh4Dl4V2ej/5XAKW+pyrP7fGBe9h9FZTXwd2PQzwAAAABJRU5ErkJggg== | |
""" | |
CenterLeft_b64=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAACzElEQVRo3u2bTXbTMBDHx3m+Q08EC/oI3MOWbHdHSlgQWnaNZZl70EC7gBNxCrFI3Po71sdITqJ5zwultvSfn0eakfwaZFkpwJuSLTwCi/C2D/Hkv43d6yOvZdlN+QJs+xBDdlN6eO1IOveIcrbmVdF37lEnBa8OpD49L9lCMbFQSbMSqluFaLb7bGq/23df9SL9+Ys7eBidplmJButYfzZhhjYGmQJM1umhPuu/Y4MMXQHTdaz9fN942CBDAJXdmRiBthlxeD2pDzWY61EdFcj2fbOJvD5wJsWqwOxC3BjTtMAClz2vnYE7pmNsdqCUKkNlSH7dFZI+uYfWp6mutQKoozVIEi6Fj+UEILB7ipUk5nYrJl/2xR1JpU9rYzNDOWGIP1fo05Sx2Mo0zq83Sj74w9CR6YwOb47JwZb2xaWC6/NBNvpCIdQzp86zcxxHdqzJkccYAcYICBD7Ou/NP+dRwwpqphT6/fnySpWEFsAKagwieqkSBK87DGzRDA79F3JRmNBinvDqSwK2yKIgAABAKT8KzRYw7b1tH0jcRXwALqdAyQGawB1La82jlAOlHIJgP3Xh75XzNe8FnG6Ev/+mOm11XpmtEsLmQQRCqdL/xu5Ovkiu+0B/3dotVVwBLHgy2rahfSHEfpGceg0tshjXWP8VMCFewen4Qna30s8rH0kFb93uMEjMgJdJoy1jfHnXAGelzpuTVQBlwNWhGSiS5TJZ3BLKl/ddp3YrK/B4mQKJ8wPAfAK4Ia1q2Vw7YZDdqgOrTyQGuLH2MXB9utETxtAVP3YB8uU9ajKJo3w/dpQPJoxKR2P2PK6MaAiiKDdagZYfhqOuDRjLbGkwDm+KAxggbY+HCk/GMRXnMPqcJTxZp3XM1tJwOJKy+/U/+vmp0f7x8bvR/mweIjgvkrvOn475j94enod3chYK/z+PPvKcRJ7d7wPnZf8Biy09F4GwYRYAAAAASUVORK5CYII= | |
""" | |
CenterBottom_b64=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAACyUlEQVRo3u2bS27bMBCGSUF3yI26aBHnHnqR3tpNFm3trfXsPeI0XeRGOQW7MKRSEmWJw5eccAAhkMORZj7+M6JoGG+3NUPeQBZ4BB6eh+fheXjePDzDFjLHC5XT1x9K/tu/T+7g3RqsuevZhBmuBZhs0lPX5D83DRJTauYN4xowE0nNTZCJe2JKK6Y3iZ9XEni01BrsxKAVnihoW8BcxKQN3jBI19BsxIcJUYOXfxvPLH1dFzhTsQafBdxUbKIcrL9h0NfHReCKPL16vvR/puM0Co+fMZlgCK06KEWeIkIr5yqEqi/QVa66jQfsqh8aL1tICbTqc6U6Xf05sFWusqprwfJlvrbyDZnCtgpT3JKZ8s9IiRhi3Rj+3LTJ5AQuW/Lnu1KQGSlXs4SB5mJlV6UsgWVXZGDfLDPfT/1OsoJZ3QyVVUMJ8SlTe/CgPR/iZ8vHlh+4bMv7Xx+m/KC5hEhpCcAMj4f62PGTVl72sudm7PABVHcQ51aR/rjBuZan7S0DnIu9BSYChxBCAWOXJilzpOf9qMleO5aOE/lBfJb68Zae9/0ck6L3AEmTYuQPVh4PsNrcnvr4mIdi6D5PClTVpANpbJFcbQ43AVEmzhZcVZMpeAxBj/S8m5jR4Vj+SSZzQH3EfiJolxwEYztgrAM5HKOsvPS8G0GsNscVKu44G/e4bPPeX21vGENLnneofjiOgk2ed07fMPiY+Fhn84nznpCH59o3BkRBiYK3YfXDEQzO2cZAG5wocP4znUnw124asnhiVQ3HcW58i7ZNiL3dLVJtLXi6JYPlwpSi8Zf37l6qwOqGXsp1DfBU+hzGcveM40KPohv6v+eNHxjr/Q0LxtybBpKk12juoQKIVjZDoyiX9KAjBcbRyckENr+33f3xQP4h8jahetzreSLd4yg6+d+eAc1/AaSyzmNed155TpSHkJce1P4BKzoCYWDV5uEAAAAASUVORK5CYII= | |
""" | |
Macro_Connect_And_Sweep_LL=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AYLECQ6qRNY5wAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAC1ElEQVRo3u2aW3LbIBSGjzTaQ3eUmTpN9uGLLvjRuTw4sR+DYsnZR5M2nemOugr6oEtVjBAI0JUzw8iyEfzn4xxAkh2EUgLWWplrEQwAHn7ZzA6eJwoGbdPacxP28nWvdP321+Mw4KFtWgIzBU4VVlN7JmB6OlNWFqwIMFmn69qsfq8LpDA8XVHXBEzVMfp6Vn+6QHpEcqNC14/xBiKUlkecHy+ic1EPDX2am5+qbbM0FCDbaFBOWxqUKDiTwNqAxIu9tCZXBZTQfEiJRJ+PvYBjgaR18LKj000yXuyZ4IZmLICiEF0AAnoKlJ/ZafoA+vrSWzJtrIzhX+eZH9mHUdwtFDrx4qm/tK12PhZwdYPdBNIlJNt+qBZWZ7ra7rrQwVBXz9iCEf0cX9TJanctuGYf4uunbrcqczDXRl17X7RuVZyrP506F4bptCJvTuYRovf9TxAkxkWfTn6+Feru3RWrLxt5Q0rb12/Pk4HT5IuNvKEtGFOIvqoP4Y978/e2dOem7z1NtU8Pfuf3tlOx4OOel7Y6H4YCBB93/7YUN89g5gFmGRPaS6a56kuPD0NPN4cLqEO0QmfvCwYLVBtxfYITGWxP9ya9aM9/zzpPbg//iSy+19mXilX1VXUP4t6WFpPcHi4E92EsHbID63Uh1H+/uxBaPdcZjTJRpgIuh6ce+0kSQgJB3lSQifFfKXG73IEj16minmDiCgA7NgzsTritXiKPLbYO5LG2vlh0HaU0cNtKI/A3ce3vznodK4demoZ5a045iztOB4+Jfn8Rrrv5vmvn2znKrl/HhiOvsvwR6IDelQQEiNQChAHRWNqyRmqMxos8LWk7VUvPETcIXAsoqj1vyh6XEAJzLgUwQkgJTvTa2UfeeoW55zxzVits5zwAOL8hKXB2zqPAnd+QhScLjnfesGCM9390ut6HrJYYCMmOxV5fpDjLpZ3z2pqWpypztb+Llze/0WHnggAAAABJRU5ErkJggg== | |
""" | |
Macro_Connect_And_Sweep_LR=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AYLECQBGBixwwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAC2ElEQVRo3u2ZXXKbMBDHhYezdaZOk57DBmzwYxznIY55NGAg96jTpmfqKeiDEcFCAgnvCuNoZzREjpD++2MXfWAFQVYQY71sYhAYeNIW7V2wvmwdgvffXy66f/X3GR1osMqEda3wLoXV1R80zGCVVcBkwYHCkwGm6rSoz/rvKn3SlFUBhAavC9ilEcLezxuvL8i26JOGV/RYqERTMbTgA+/9VO+bp4GC5GmII5f4QVZdo/LKmgoPGwIcJrA+IKPpS0MTC4oHDnWpwooMPp4HAccDyepoyw6RqQKdyELjgbs24wHsA1EBXkHaCj9NN6TrvqHKSRsvY2gbAjaWrfZkN6PYRVCd0XQ73PasPvhYwIkeNgZI4VIlvtv2nsKvdl873ZIY0BepCcP/sxktMEztk66oGzM4bB/MeR4WvFuIOkxf7KGdShJX71iFZdL2GswuWubtQuP6ZLFI0cc4HDxQv0zkYcFLfrzejKMYvpjIg4a3/P10U9GH5cOkKE57Pbawg4vaXVrqe2eMwgMH1bcwbRfvTyYvu9NWfNi3eF9/TvP3rwTnALOKB/By0kyDYQ0+ltIO43C/4wi5PqM6B12qiEDpEgcFDuthS3239Y6nwdOH3ZlI+juEQSz66/rqujHGUl7nsWLSh11D8BDG0wH5YMFOVbzjuiG0XtchmhdlusGV8NRj2Ds+lg6ErU7RdpKJKwEslNLF9pWmy/Ja/i8lxPMS8TiZTzw3ho88vlgRyFDYXi66QiUNUOa5MUkzv/pbZJbjxODnTtnPULqt9e0fenpVE4RlfVYs9UNR14nhIk84yK/H3jD1UGyCaARA7ne203IMz8Ksm+MkGhQs1TIn9zvhoqXtlz6SMiZ9JFUQU85LlvutdVpM5AksfwvOriZtJc2ZR631asKYzyMzYbREnwiciTwJcK1pi/XtYMyFAqNr6vwtUPuG8dVtPovOrtx33my2N++8nvYfI8m7sS3TiAMAAAAASUVORK5CYII= | |
""" | |
Macro_Connect_And_Sweep_TL=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AYLECMS0+dm2gAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAC10lEQVRo3u2bz3KbMBDGdxneoc/Uf+lzxBiMcgx2DmmcYyAO4OdonLozfTl6IJrIGASIlRAuO6MD2Ja+/fmThCQbr6+fCphDKRwABKqyz2+Asj7bi/M/OibfM+l1Z+chAlCUfV4K2Ofs5F71PVTtDSkcGOIHOJV6tDpv4cWQZ6W4PGOw8GIrnOctYul1jzGPoBsIYERgNoe3iCHLmTI4MnhVR4nXHKYtruPBwWU5Gxfe1KIKTBWgg4hAVcqBt/v9sQoAwNJLABFh6SXK+ow4z1smVjmPA2u6TrOwUz3oecngFUaars4FLp8n3bU5wCpYMVzdjU89xDyqIGnhIQIUpZER9C+Zi7+funfVX7f0zuNP3DTZFL267cvVY+t7/NfbxmGi7rWmOtMfj9I6T+pIQ/Dfx2kZHtd0N2gD1pZYX9h17Yn36trzO05wrpxtR8H+DtI0eHfcjvfhiuCtJOFIdZzoADOSauAgVTS4Zty2JQQ2xJXNIF+utr01OabB+a/RKODqQFZ1yHqH/gkDPrZ8dt/PhQSHCCjbo6grOEQnWjnA4BCN47wmcLZGnba6HIyPeTZDq9PZBZrgPKo9/fNvLDisQc/5gTjb0pZSs5jLfIYxYAh6kG1J0Z0LiLF6W2s9g+ATho6yelufTUzGzjCqjU8xxByevz2M85x3yeHMrlPPZXbegHCReImx2/nGxFNr79vW7LwhzqOqiO/qhr8384ShGsnXnxcDpy2Xudva4Dyxu16C+8QcmoYiZyzLT7m7kq9tEQHYcdNpTWh7EYMdN+bWtiLA+Mv03CdqrppB26NKm5g2ITZB6zFh0G8osuNdgzg7f5hdB67MQf45DMO00PuN3teIsslx6vq0w6sTaANECk1G4DWJNQ2SWgMylhr9B9DT53vp6zd/7ibTnnF4fRJTSU5HnVbC65v0kKB2tJHnPNXkhsLUActaeGMkb82uyrwlNUev+AeAWxFWDD2nCwAAAABJRU5ErkJggg== | |
""" | |
Macro_Connect_And_Sweep_TR=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AYLECIu5ZMrHAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAACvElEQVRo3u2aW3KbMBSGjzJeW2d6ibuOmHsea7sPaZzH2AiM9xGn7pq6CvrgGguQZAldAIUzo7HBIP3n45cEwujh4bWEKTrFHQCCj1IOxaPW+u4m/yg4DyEAV8qhSJjbhyIBgPYxKsUp5y28LRT7M6Rin8DC25oe89wPEiQJWDXQYrEtXYYlsn9yXg8xQwg5mRgrL535Ouk8z9/ZuUCet3P+CSPPo9Y+30/px+5j8D0x+DMr4r+/sK/ep78W4Ikf63s7yPdx9d2683iw+oBXltWAd92QGPtYEGe6xs9sfhtY8PaDLZDSjVTrvEbUoAgQcMbFLI9rxyAT3fZWcmKJiZ9Pa4/cp9reBVwgOOEg309LeWgbTsJLyfEo/O88bFxD17a03arQRAdvy6rYCl6bPLDiDoy429LwmqJsA7sF0hRAGjjhJalsvmmJCY9LLcs6QEyEqiU8tgFm802ntsIgrU3KYZDKL0nh+/YVbIocUtC00XIQqitIAWdRBVKp24bH5aDB6dZ5AYeziAWPvUZPXrHwuAIz7xaqzqS9nDXT3Hf73CswVIEUfoeB758//JJTGODap/CEUbs/f18Ze++gc8Kgleh9RVmWEjgvxNxt5oSRfnuugRt7mMphWkk2Bc8F15nMZXKeQnDfYdh8v4FxYK0tXXlNzlNxXu9jUZRba2v39RcAAMS/1+add2nMhTCRy9RtdcMjbe2C+8gcdHVZYeeNGaBJ7cxn2+S0ln4eHGIhIzmttdbNdR4JcPtlfO4jNTfNYP1W5SLGhBBT0AxPGPxFweT0kyFumH/apoE756C/LRTHeSl+RZ8ooobkOLv6pODRBA4BYl+apOGxxNoGOQQNKEnyzv+Sev38xP398Y/eJGy3ZxSeTGJdkjNR5yDhySatEn0CM74k1UxOFeZQYFmBN5bkpyWpCd444x8+MBrlUkwPVAAAAABJRU5ErkJggg== | |
""" | |
Macro_Connect_And_Sweep_CE=\ | |
""" | |
iVBORw0KGgoAAAANSUhEUgAAAE8AAAAxCAYAAACbHPQ3AAADA0lEQVRo3u2bQXabMBCGBx5n6I2ySRq39zAIyK523UXtJLsYJHqPxmmy6Y16CXVhY8sgZElIQiTMe7xYsYX++fhHQjgJ8ryiMIVWhK4H3D7Fwrbsex8SXn5XHaFsn2LI76rJebYc6rP7BoFXu2/MrvPWeSxYtswneJLOFLV9iSDLhr1V2V7/7BZ39Q/o309i0G8/BtMe+QTLxPlcwox8AcZN+iruhNF1Tvb3tkFGQwHrm1izP2882yAjAGoY2lqQ8IppyY5LJWGuhBpqkOcaPHIeT7RJsfKu7Aa5vV4b0xTaApe/rQYBxwPZ1CGqDiXn0Z5VW9y0hWSv5qBRQ7NK9ro601oD7KM1SFNCbYMrS80dAg0AAj15aVpZv9jG5jyTbrMZtU4eRGfw2MFlwXW5oStKnT6SLmfLuLhZa1380FS5jj10cgo/Srna0B66KNexAFR1X0R73Auo9tUZS1efi37aZZv++W7NDWWZQFkmQIEeX9uMrlxKjNzsMN5jpAhDiVEnxMhn8UFw2mFccsHp9ubwOaw4GG70F7gwRdh/eOz0Uwu+yADvSxwhojZVfN5wS7iGxhtfe2+r06/PPlW1r4m8MEGAkgM0arBs8e0G0IudRUPVNX0D3274OhJ8aXvW57EFtfx5cKhNvZ/yaotelswVux/9isrmwObmZHs2ZoAi7ZikwjYAQEjpfpJUOZLdsjXJig7Zz5k4VMZiI9ktW+9hkgKlJ3DN/toLRrJbApntrxyZ3beA8qKqkDeuq7XXubTyi0sgVXrWtnaTXIuRgegLtIsGOQDkgQMACOK4oP3EPHBcufAUnJpWUmWQxMXxp/EFI9ktWgJ4In0Dx9PdBCdqay8YvCN+bgMkswcni4ToqHWwET8vpBaTeF7sc5sX3AUjmM8Lo3eu1Zdu1zUB2wpXGozDk0nABkjX41mFp5KYTnI2zuklPNWk+4SrqeHwSMrtH4bOf387a//6+mj0fC4fPgz+MLSd/Hhi+g5jgjfBG11EdPqfx8l5gzjP7fcK7yv+AxcwYgOsAbMUAAAAAElFTkSuQmCC | |
""" | |
arrowUp = [ | |
"24 24 3 1", | |
" c None", | |
". c #4e9a06", | |
"+ c #FFFFFF", | |
" ...... ", | |
" .....+...... ", | |
" ......+....... ", | |
" ......+++....... ", | |
" .......+++........ ", | |
" .......+++++........ ", | |
" ........+++++......... ", | |
" .......+++++++........ ", | |
" .......+++++++........ ", | |
"........+++++++.........", | |
".......+++++++++........", | |
".......+++++++++........", | |
"......+++++++++++.......", | |
"......+++++++++++.......", | |
".....+++++++++++++......", | |
" ....+++++++++++++..... ", | |
" ...+++...+++...+++.... ", | |
" ...+.....+++.....+.... ", | |
" ........+++......... ", | |
" .......+++........ ", | |
" ......+++....... ", | |
" .....+++...... ", | |
" ....+++..... ", | |
" ...... "] | |
#### Section Icones #### | |
#### | |
try: | |
import webbrowser | |
except Exception: | |
None | |
try: | |
def errorDialog(msg): | |
import PySide | |
from PySide import QtGui | |
import sys, os | |
diag = QtGui.QMessageBox(QtGui.QMessageBox.Critical,u"Error FreeCAD Version",msg ) | |
diag.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint) # PySide #cette fonction met la fenetre en avant | |
diag.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300; font: bold}") | |
FreeCAD.Console.PrintMessage("https://gist.githubusercontent.com/mario52a/3ec67a3711202dab69592ce53b938924/raw/5adea7e9362849fa04d28e5a4065cd4129ea707a/Macro_Connect_And_Sweep.FCMacro" + "\n\n") | |
diag.exec_() | |
diag.setStyleSheet("Base") | |
quit("None") | |
if int(FreeCAD.Version()[1]) < 18: # Version de FreeCAD | |
errorDialog("This version " + __title__ + " work with the FreeCAD 0.18 or higher. " + "\n" | |
"PySide2 Qt version: 5" + "\n" | |
"See the page (Report view) for copy the link of the precedent version. " + "\n") | |
# | |
except Exception: | |
None | |
#### | |
import PySide2 | |
from PySide2 import (QtWidgets, QtCore, QtGui) | |
from PySide2.QtWidgets import (QWidget, QApplication, QSlider, QGraphicsView, QGraphicsScene, QVBoxLayout, QStyle) | |
from PySide2.QtGui import (QPainter, QColor, QIcon) | |
from PySide2.QtSvg import * | |
import PySide2.QtXml | |
######import for WebPage | |
#import WebGui | |
#from PySide2 import QtUiTools, QtNetwork | |
#from PySide2.QtCore import QUrl | |
######import for WebPage | |
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui | |
import DraftVecUtils | |
from math import sqrt, pi, sin, cos, asin | |
from FreeCAD import Base | |
#import time | |
#time.sleep(0.1) | |
App = FreeCAD | |
global ui ; ui = "" | |
global path | |
##path########################################################################### | |
#path = FreeCAD.ConfigGet("AppHomePath") | |
#path = FreeCAD.ConfigGet("UserAppData") | |
#path = "your path" | |
param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")# macro path | |
path = param.GetString("MacroPath","") + "/" # macro path | |
path = path.replace("\\","/") | |
#App.Console.PrintMessage(str("Path for the icons : ") + path + "\n" + __title__ + " : " +__version__ + " " + __date__ + "\n") | |
################################################################################# | |
try: | |
_fromUtf8 = QtCore.QString.fromUtf8 | |
except AttributeError: | |
def _fromUtf8(s): | |
return s | |
try: | |
_encoding = QtGui.QApplication.UnicodeUTF8 | |
def _translate(context, text, disambig): | |
return QtGui.QApplication.translate(context, text, disambig, _encoding) | |
except AttributeError: | |
def _translate(context, text, disambig): | |
return QtGui.QApplication.translate(context, text, disambig) | |
####nouveau objectRealPlacement3D####################################################################### | |
####return objectRealPlacement3DX, objectPlacementAngle (avec bbox = "BB") | |
def objectRealPlacement3D(obj, mode = 0, bbox = "" ): #obj : object, mode : 0=Base, 1=BoundBox.Center, 2=CenterOfMass | |
try: | |
try: | |
objectPlacement = obj.Shape.Placement | |
except Exception: | |
objectPlacement = obj.Placement | |
objectPlacementBase = FreeCAD.Vector(objectPlacement.Base) | |
objectPlacementAngle = objectPlacement.Rotation.toEuler() | |
#### | |
if mode == 0: # 0=Base | |
objectWorkCenter = objectPlacementBase | |
elif mode == 1: # 1=BoundBox.Center | |
objectBoundBoxCenter = FreeCAD.Vector(obj.Shape.BoundBox.Center) | |
objectWorkCenter = objectBoundBoxCenter | |
elif mode == 2: # 2=CenterOfMass | |
try: | |
objectCenterOfMass = FreeCAD.Vector(obj.Shape.CenterOfMass) | |
except Exception: | |
objectCenterOfMass = FreeCAD.Vector(0.0, 0.0, 0.0) | |
objectWorkCenter = objectCenterOfMass | |
#### | |
if hasattr(obj, "getGlobalPlacement"): | |
globalPlacement = obj.getGlobalPlacement() | |
globalPlacementBase = FreeCAD.Vector(globalPlacement.Base) | |
if bbox != "BB": | |
objectRealPlacement3DX = globalPlacementBase.add(objectWorkCenter).sub(objectPlacementBase) | |
else: | |
objectRealPlacement3DX = globalPlacementBase.sub(objectWorkCenter)#mode=0 adapte pour BBox + Centerpoints | |
objectPlacementAngle = globalPlacement.Rotation.toEuler() | |
else: | |
objectRealPlacement3DX = objectWorkCenter | |
objectPlacementAngle = obj.Placement.Rotation.toEuler() | |
#print(objectRealPlacement3DX," : ", objectPlacementAngle) | |
if bbox != "BB": | |
return objectRealPlacement3DX, objectPlacementAngle | |
else: | |
return objectRealPlacement3DX | |
except Exception: | |
return FreeCAD.Vector(0.0, 0.0, 0.0), (0.0, 0.0, 0.0) | |
####nouveau objectRealPlacement3D####################################################################### | |
class Ui_MainWindow(object): | |
global path | |
def __init__(self): | |
global path | |
self.path = path | |
self.Polyline_Number_Faces = 3 | |
self.Polyline_CirCon = 5.0 | |
self.Rectangle_X = 5.0 | |
self.Rectangle_Y = 3.0 | |
self.Circle_Radius = 1.0 | |
self.Circle_Radius_Sbs = 0.5 | |
self.Circle_Diameter = self.Circle_Radius * 2.0 | |
self.Thickness = 0.0 | |
self.FcSweep = "" | |
self.FcSweepS = "" | |
self.Forme = "" | |
self.FormeSubtract = "" | |
self.cutFcSweep = "" | |
self.ligne = "" | |
self.sweepForme = "" | |
self.discretize = 1.0 | |
#01 self.nameL = [] # contener en attente | |
self.CASweep = "" # conteneur dossier | |
self.ElementName = "" | |
self.sweepFace = "" | |
self.sweepFaceName = "" | |
self.selectForDuplicate = [] | |
size_ecran = QtWidgets.QDesktopWidget().screenGeometry() # donne les dimensions de l'ecran | |
self.orgWidth = size_ecran.width() | |
self.orgHeight = size_ecran.height() | |
def setupUi(self, MainWindow): | |
self.window = MainWindow | |
MainWindow.resize(360, 570) | |
#MainWindow.setGeometry(50, 50, 360, 570) | |
# MainWindow.move(900,115) | |
self.centralwidget = QtWidgets.QWidget(MainWindow) | |
###################################################################### | |
#### #Titre | |
self.widget = QtWidgets.QWidget(self.centralwidget) | |
grid = QtWidgets.QGridLayout(self.centralwidget) | |
grid.addWidget(self.widget) | |
#### | |
self.label = QtWidgets.QLabel() | |
font = QtGui.QFont() | |
font.setPointSize(12) | |
self.label.setFont(font) | |
self.PB_Help = QtWidgets.QPushButton() | |
self.PB_Help.setToolTip(_fromUtf8("Help on line " + __version__ + " " + __date__ + " rmu")) | |
self.PB_Help.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_MessageBoxQuestion))) | |
self.PB_Help.clicked.connect(self.on_PB_Help) ### | |
grid.addWidget(self.widget, 0, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid01 = QtWidgets.QGridLayout(self.widget) | |
grid01.addWidget(self.label, 0, 0) | |
grid01.addWidget(self.PB_Help, 0, 1) | |
#### #Titre | |
#### #Mode | |
self.GBox_00 = QtWidgets.QGroupBox() | |
self.RB_01_BBox_Oject = QtWidgets.QRadioButton() | |
#self.RB_01_BBox_Oject.setChecked(True) | |
self.RB_01_BBox_Oject.clicked.connect(self.on_RB_00_Mode_clicked) | |
self.RB_03_Subo_Subo = QtWidgets.QRadioButton() | |
self.RB_03_Subo_Subo.setChecked(True)# | |
self.RB_03_Subo_Subo.clicked.connect(self.on_RB_00_Mode_clicked) | |
self.RB_02_BBox_Subo = QtWidgets.QRadioButton() | |
#self.RB_02_BBox_Subo.setChecked(True) | |
self.RB_02_BBox_Subo.clicked.connect(self.on_RB_00_Mode_clicked) | |
self.label_Info = QtWidgets.QLabel() | |
# #### | |
grid.addWidget(self.GBox_00, 1, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid02 = QtWidgets.QGridLayout(self.GBox_00) | |
grid02.addWidget(self.RB_01_BBox_Oject, 0, 0) | |
grid02.addWidget(self.RB_02_BBox_Subo, 1, 0) | |
grid02.addWidget(self.RB_03_Subo_Subo, 0, 1) | |
#### #Mode | |
#### #Forme | |
self.GBox_02_ = QtWidgets.QGroupBox() | |
self.DS_Polyline_CirCon = QtWidgets.QDoubleSpinBox() | |
self.DS_Polyline_CirCon.setDecimals(3) | |
self.DS_Polyline_CirCon.setMinimum(0.00001) | |
self.DS_Polyline_CirCon.setMaximum(999999.999999) | |
self.DS_Polyline_CirCon.setValue(self.Polyline_CirCon) | |
self.DS_Polyline_CirCon.valueChanged.connect(self.on_DS_Polyline_CirCon) ### | |
self.SB_Polyline_Number_Faces = QtWidgets.QSpinBox() | |
self.SB_Polyline_Number_Faces.setPrefix(_fromUtf8("")) | |
self.SB_Polyline_Number_Faces.setMinimum(3) | |
self.SB_Polyline_Number_Faces.setMaximum(999999) | |
self.SB_Polyline_Number_Faces.setValue(self.Polyline_Number_Faces ) | |
self.SB_Polyline_Number_Faces.valueChanged.connect(self.on_SB_Polyline_Number_Faces) ### | |
self.RB_Polyline = QtWidgets.QRadioButton() | |
self.RB_Polyline.setChecked(True) | |
self.RB_Polyline.setIcon(QtGui.QIcon.fromTheme("refresh",QtGui.QIcon(":/icons/Draft_Polygon.svg"))) | |
self.RB_Polyline.clicked.connect(self.on_RB_Polyline_clicked) | |
self.CB_Insc_Circon = QtWidgets.QCheckBox() | |
self.CB_Insc_Circon.setEnabled(True) | |
self.CB_Insc_Circon.setText(_fromUtf8("Polygon Circumscribed")) | |
self.CB_Insc_Circon.clicked.connect(self.on_CB_Insc_Circon_clicked) | |
self.DS_Rectangle_X = QtWidgets.QDoubleSpinBox() | |
self.DS_Rectangle_X.setDecimals(3) | |
self.DS_Rectangle_X.setDecimals(3) | |
self.DS_Rectangle_X.setMinimum(0.00001) | |
self.DS_Rectangle_X.setMaximum(999999.999999) | |
self.DS_Rectangle_X.setValue(self.Rectangle_X) | |
self.DS_Rectangle_X.valueChanged.connect(self.on_DS_Rectangle_X) ### | |
self.DS_Rectangle_Y = QtWidgets.QDoubleSpinBox() | |
self.DS_Rectangle_Y.setDecimals(3) | |
self.DS_Rectangle_Y.setDecimals(3) | |
self.DS_Rectangle_Y.setMinimum(0.00001) | |
self.DS_Rectangle_Y.setMaximum(999999.999999) | |
self.DS_Rectangle_Y.setValue(self.Rectangle_Y) | |
self.DS_Rectangle_Y.valueChanged.connect(self.on_DS_Rectangle_Y) ### | |
self.RB_Rectangle = QtWidgets.QRadioButton() | |
self.RB_Rectangle.setIcon(QtGui.QIcon.fromTheme("refresh",QtGui.QIcon(":/icons/Draft_Rectangle.svg"))) | |
self.RB_Rectangle.clicked.connect(self.on_RB_Rectangle_clicked) | |
self.RB_Ellipse = QtWidgets.QRadioButton() | |
self.RB_Ellipse.setIcon(QtGui.QIcon.fromTheme("refresh",QtGui.QIcon(":/icons/Draft_Ellipse.svg"))) | |
self.RB_Ellipse.clicked.connect(self.on_RB_Ellipse_clicked) | |
self.DS_Circle_Radius = QtWidgets.QDoubleSpinBox() | |
self.DS_Circle_Radius.setDecimals(3) | |
self.DS_Circle_Radius.setMinimum(0.00001) | |
self.DS_Circle_Radius.setMaximum(999999.999999) | |
self.DS_Circle_Radius.setValue(self.Circle_Radius) | |
self.DS_Circle_Radius.valueChanged.connect(self.on_DS_Circle_Radius) ### | |
self.DS_Circle_Diameter = QtWidgets.QDoubleSpinBox() | |
self.DS_Circle_Diameter.setDecimals(3) | |
self.DS_Circle_Diameter.setMinimum(0.00001) | |
self.DS_Circle_Diameter.setMaximum(999999.999999) | |
self.DS_Circle_Diameter.setValue(self.Circle_Diameter) | |
self.DS_Circle_Diameter.valueChanged.connect(self.on_DS_Circle_Diameter) ### | |
self.RB_Circle = QtWidgets.QRadioButton() | |
self.RB_Circle.setIcon(QtGui.QIcon.fromTheme("refresh",QtGui.QIcon(":/icons/Draft_Circle.svg"))) | |
self.RB_Circle.clicked.connect(self.on_RB_Circle_clicked) | |
self.RB_Line = QtWidgets.QRadioButton() | |
self.RB_Line.setIcon(QtGui.QIcon.fromTheme("refresh",QtGui.QIcon(":/icons/Draft_Line.svg"))) | |
self.RB_Line.clicked.connect(self.on_RB_Line_clicked) | |
self.CB_Solid = QtWidgets.QCheckBox() | |
self.CB_Solid.setChecked(True) | |
self.CB_Solid.clicked.connect(self.on_CB_Solid_clicked) | |
self.label_Pipe = QtWidgets.QLabel() | |
self.DS_Pipe = QtWidgets.QDoubleSpinBox() | |
self.DS_Pipe.setDecimals(3) | |
self.DS_Pipe.setMinimum(0.00001) | |
self.DS_Pipe.setMaximum(999999.999999) | |
self.DS_Pipe.setValue(self.Thickness) | |
self.DS_Pipe.valueChanged.connect(self.on_DS_Pipe) ### | |
grid.addWidget(self.GBox_02_, 2, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
self.grid03 = QtWidgets.QGridLayout(self.GBox_02_) | |
self.grid03.addWidget(self.CB_Insc_Circon, 0, 1) | |
self.grid03.addWidget(self.RB_Polyline, 1, 0) | |
self.grid03.addWidget(self.DS_Polyline_CirCon,1, 1) | |
self.grid03.addWidget(self.SB_Polyline_Number_Faces, 1, 2) | |
self.grid03.addWidget(self.RB_Rectangle, 2, 0) | |
self.grid03.addWidget(self.DS_Rectangle_X, 2, 1) | |
self.grid03.addWidget(self.DS_Rectangle_Y, 2, 2) | |
self.grid03.addWidget(self.RB_Ellipse, 3, 0) | |
self.grid03.addWidget(self.RB_Circle, 4, 0) | |
self.grid03.addWidget(self.DS_Circle_Radius, 4, 1) | |
self.grid03.addWidget(self.DS_Circle_Diameter, 4, 2) | |
self.grid03.addWidget(self.RB_Line, 5, 0) | |
self.grid03.addWidget(self.CB_Solid, 6, 0) | |
self.grid03.addWidget(self.label_Pipe, 7, 0) | |
self.grid03.addWidget(self.DS_Pipe, 7, 1) | |
#### #Forme | |
#### #Graphique | |
self.GBox_07_ = QtWidgets.QGroupBox() | |
self.GBox_07_.setVisible(False) | |
# self.GBox_07_.setVisible(True) | |
self.RB_Top_Left = QtWidgets.QRadioButton() | |
self.RB_Top_Left.setLayoutDirection(QtCore.Qt.RightToLeft) | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(-45), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Top_Left.setIconSize(QtCore.QSize(24, 24)) | |
self.RB_Top_Left.setIcon(iconRotate) | |
self.RB_Top_Left.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Center_Top = QtWidgets.QRadioButton() | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(0), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Center_Top.setIcon(iconRotate) | |
self.RB_Center_Top.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Top_Rigth = QtWidgets.QRadioButton() | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(45), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Top_Rigth.setIconSize(QtCore.QSize(24, 24)) | |
self.RB_Top_Rigth.setIcon(iconRotate) | |
self.RB_Top_Rigth.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Center_Left = QtWidgets.QRadioButton() | |
self.RB_Center_Left.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_ArrowLeft))) # | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(-90), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Center_Left.setIcon(iconRotate) | |
self.RB_Center_Left.setLayoutDirection(QtCore.Qt.RightToLeft) | |
self.RB_Center_Left.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Center_Right = QtWidgets.QRadioButton() | |
self.RB_Center_Right.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_ArrowRight))) # | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(90), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Center_Right.setIcon(iconRotate) | |
self.RB_Center_Right.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Low_Left = QtWidgets.QRadioButton() | |
self.RB_Low_Left.setLayoutDirection(QtCore.Qt.RightToLeft) | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(225), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Low_Left.setIconSize(QtCore.QSize(24, 24)) | |
self.RB_Low_Left.setIcon(iconRotate) | |
self.RB_Low_Left.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Center_Bottom = QtWidgets.QRadioButton() | |
self.RB_Center_Bottom.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_ArrowDown))) # | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(180), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Center_Bottom.setIcon(iconRotate) | |
self.RB_Center_Bottom.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Low_Rigth = QtWidgets.QRadioButton() | |
iconRotate = QtGui.QPixmap(arrowUp).transformed(QtGui.QTransform().rotate(135), QtCore.Qt.SmoothTransformation)#Rotation | |
self.RB_Low_Rigth.setIconSize(QtCore.QSize(24, 24)) | |
self.RB_Low_Rigth.setIcon(iconRotate) | |
self.RB_Low_Rigth.clicked.connect(self.on_RB_Image_clicked) | |
self.RB_Center = QtWidgets.QRadioButton() | |
self.RB_Center.setStyleSheet("") | |
self.RB_Center.setChecked(True) | |
self.RB_Center.setChecked(True) | |
self.RB_Center.clicked.connect(self.on_RB_Image_clicked) | |
####Screen Graphic BitMap | |
##https://doc.qt.io/qtforpython/PySide2/QtCore/Qt.html | |
self.graphicsView = QtWidgets.QGraphicsView() | |
pic = QtGui.QPixmap() | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_CE)) | |
self.scene = QtWidgets.QGraphicsScene() | |
self.scene.addPixmap(QtGui.QPixmap(pic)) # png (bmp) | |
self.graphicsView.setScene(self.scene) | |
####Screen Graphic BitMap | |
########################### | |
# ####Screen Graphic SVG | |
# self.graphicsView = QtWidgets.QGraphicsView() | |
# pic = PySide2.QtSvg.QGraphicsSvgItem(path + "FreeCAD.svg") # svg | |
# self.scene = QtWidgets.QGraphicsScene() | |
# self.scene.addItem(pic) | |
# self.graphicsView.setScene(self.scene) | |
# ####Screen Graphic SVG | |
########################### PySide2.QtCore. | |
grid.addWidget(self.GBox_07_, 2, 2, 1, 3) #linge, colonne, ligne case, nombre de cases) | |
grid04 = QtWidgets.QGridLayout(self.GBox_07_) | |
grid04.addWidget(self.RB_Top_Left, 1, 0) | |
grid04.addWidget(self.RB_Center_Top, 1, 1) | |
grid04.addWidget(self.RB_Top_Rigth, 1, 2) | |
grid04.addWidget(self.RB_Center, 2, 1) | |
grid04.addWidget(self.RB_Center_Left, 3, 0) | |
grid04.addWidget(self.graphicsView, 3, 1) | |
grid04.addWidget(self.RB_Center_Right, 3, 2) | |
grid04.addWidget(self.RB_Low_Left, 4, 0) | |
grid04.addWidget(self.RB_Center_Bottom, 4, 1) | |
grid04.addWidget(self.RB_Low_Rigth, 4, 2) | |
#### #Graphique | |
# # tabWidget #### | |
## | |
self.GBox_06_ = QtWidgets.QGroupBox() | |
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) | |
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North) | |
self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded) | |
self.TAB_Discretize = QtWidgets.QWidget() | |
#################### | |
self.DS_Discretize = QtWidgets.QDoubleSpinBox() | |
#### # Doit demarrer en "Spinbox" !! | |
# self.DS_Discretize.setMinimum(0.000001) # DoubleSpinBox | |
# self.DS_Discretize.setMaximum(999999.99999) # DoubleSpinBox | |
# self.DS_Discretize.setDecimals(3) # DoubleSpinBox | |
#### | |
self.DS_Discretize.setSuffix(" Sec") # nombre de Sections | |
self.DS_Discretize.setMinimum(1) # SpinBox | |
self.DS_Discretize.setMaximum(999999) # SpinBox | |
self.DS_Discretize.setDecimals(0) # SpinBox | |
self.discretize = int(self.discretize) # SpinBox | |
#### | |
self.DS_Discretize.setValue(self.discretize) | |
self.DS_Discretize.valueChanged.connect(self.on_DS_Discretize) ### | |
#################### | |
self.CB_Discretize = QtWidgets.QCheckBox() | |
self.CB_Discretize.clicked.connect(self.on_CB_Discretize_clicked) | |
self.CB_Reverse = QtWidgets.QCheckBox() | |
self.CB_Reverse.setEnabled(False) | |
self.CB_Reverse.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload))) # | |
self.CB_Reverse.clicked.connect(self.on_CB_Reverse) | |
self.PB_Del_Points = QtWidgets.QPushButton() | |
self.PB_Del_Points.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogCancelButton))) # | |
self.PB_Del_Points.clicked.connect(self.on_PB_Del_Points) ### | |
self.PB_Discretize = QtWidgets.QPushButton() | |
self.PB_Discretize.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogApplyButton))) # | |
self.PB_Discretize.clicked.connect(self.on_PB_Discretize) ### | |
self.tabWidget.addTab(self.TAB_Discretize, "") | |
## | |
# # Tab_Face #### | |
## | |
self.Tab_Face = QtWidgets.QWidget() | |
self.PB_Reset_Face = QtWidgets.QPushButton() | |
self.PB_Reset_Face.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogResetButton))) # | |
self.PB_Reset_Face.clicked.connect(self.on_PB_Reset_Sweep) ### | |
self.PB_Visibility = QtWidgets.QPushButton() | |
self.PB_Visibility.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_FileDialogListView))) # | |
self.PB_Visibility.clicked.connect(self.on_PB_Visibility) ### | |
self.PB_Create_Face = QtWidgets.QPushButton() | |
self.PB_Create_Face.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogApplyButton))) # | |
self.PB_Create_Face.clicked.connect(self.on_PB_Create_Face) ### | |
self.tabWidget.addTab(self.Tab_Face, "") | |
self.tabWidget.addTab(self.Tab_Face, "") | |
## | |
# # Tab_Sweep #### | |
## | |
self.Tab_Sweep = QtWidgets.QWidget() | |
self.PB_Reset_Sweep = QtWidgets.QPushButton() | |
self.PB_Reset_Sweep.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogResetButton))) # | |
self.PB_Reset_Sweep.clicked.connect(self.on_PB_Reset_Sweep) ### | |
self.PB_Del_Sweep = QtWidgets.QPushButton() | |
self.PB_Del_Sweep.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogCancelButton))) # | |
self.PB_Del_Sweep.clicked.connect(self.on_PB_Del_Sweep) ### | |
self.PB_Sweep = QtWidgets.QPushButton() | |
self.PB_Sweep.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogApplyButton))) # | |
self.PB_Sweep.clicked.connect(self.on_PB_Sweep) ### | |
self.CB_Solid_Sweep = QtWidgets.QCheckBox(self.Tab_Sweep) | |
#self.CB_Solid_Sweep.clicked.connect(self.on_CB_Solid_Sweep) | |
self.CB_Frenet_Sweep = QtWidgets.QCheckBox() | |
#self.CB_Frenet_Sweep.clicked.connect(self.on_CB_Frenet_Sweep) | |
self.tabWidget.addTab(self.Tab_Sweep, "") | |
## | |
# # Tab_Loft #### | |
## | |
self.Tab_Loft = QtWidgets.QWidget() | |
self.PB_Reset_Loft = QtWidgets.QPushButton() | |
self.PB_Reset_Loft.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogResetButton))) # | |
self.PB_Reset_Loft.clicked.connect(self.on_PB_Reset_Sweep) ### | |
self.PB_Del_Loft = QtWidgets.QPushButton() | |
self.PB_Del_Loft.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogCancelButton))) # | |
self.PB_Del_Loft.clicked.connect(self.on_PB_Del_Sweep) ### | |
self.PB_Loft = QtWidgets.QPushButton() | |
self.PB_Loft.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogApplyButton))) # | |
self.PB_Loft.clicked.connect(self.on_PB_Loft) ### | |
self.CB_Solid_Loft = QtWidgets.QCheckBox() | |
#self.CB_Solid_Loft.clicked.connect(self.on_CB_Solid_Loft) | |
self.CB_Ruled_Loft = QtWidgets.QCheckBox() | |
#self.CB_Ruled_Loft.clicked.connect(self.on_CB_Ruled_Loft) | |
self.CB_Closed_Loft = QtWidgets.QCheckBox() | |
#self.CB_Closed_Loft.clicked.connect(self.on_CB_Closed_Loft) | |
self.tabWidget.addTab(self.Tab_Loft, "") | |
grid.addWidget(self.GBox_06_, 4, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
gridBox = QtWidgets.QGridLayout(self.GBox_06_) | |
gridBox.addWidget(self.tabWidget, 4, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid05 = QtWidgets.QGridLayout(self.TAB_Discretize) | |
grid05.addWidget(self.DS_Discretize, 0, 0) | |
grid05.addWidget(self.CB_Discretize, 0, 1) | |
grid05.addWidget(self.CB_Reverse, 0, 2) | |
grid05.addWidget(self.PB_Del_Points, 1, 0) | |
grid05.addWidget(self.PB_Discretize, 1, 1) | |
gridBox.addWidget(self.tabWidget, 4, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid06 = QtWidgets.QGridLayout(self.Tab_Face) | |
grid06.addWidget(self.PB_Reset_Face, 0, 0) | |
grid06.addWidget(self.PB_Visibility, 0, 1) | |
grid06.addWidget(self.PB_Create_Face, 0, 2) | |
gridBox.addWidget(self.tabWidget, 4, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid07 = QtWidgets.QGridLayout(self.Tab_Sweep) | |
grid07.addWidget(self.PB_Reset_Sweep, 0, 0) | |
grid07.addWidget(self.PB_Del_Sweep, 0, 1) | |
grid07.addWidget(self.PB_Sweep, 0, 2) | |
grid07.addWidget(self.CB_Solid_Sweep, 1, 0) | |
grid07.addWidget(self.CB_Frenet_Sweep, 1, 1) | |
gridBox.addWidget(self.tabWidget, 4, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid08 = QtWidgets.QGridLayout(self.Tab_Loft) | |
grid08.addWidget(self.PB_Reset_Loft, 0, 0) | |
grid08.addWidget(self.PB_Del_Loft, 0, 1) | |
grid08.addWidget(self.PB_Loft, 0, 2) | |
grid08.addWidget(self.CB_Solid_Loft, 1, 0) | |
grid08.addWidget(self.CB_Ruled_Loft, 1, 1) | |
grid08.addWidget(self.CB_Closed_Loft, 1, 2) | |
#### #Tab | |
#### | |
# # Sortie #### | |
#### | |
#### #Sortie | |
self.GBox_05_ = QtWidgets.QGroupBox() | |
self.PB_Del_Last_Line = QtWidgets.QPushButton() | |
self.PB_Del_Last_Line.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogCancelButton))) # | |
self.PB_Del_Last_Line.clicked.connect(self.on_PB_Del_Last_Line) ### | |
self.PB_Quit = QtWidgets.QPushButton() | |
##https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html | |
##https://doc.qt.io/qt-5/qstyle.html#StandardPixmap-enum | |
self.PB_Quit.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogCloseButton))) #PySide2 Qt5 | |
self.PB_Quit.clicked.connect(self.on_PB_Quit) ### | |
self.PB_Create = QtWidgets.QPushButton() | |
self.PB_Create.setIcon(QIcon(QApplication.style().standardIcon(QStyle.SP_DialogApplyButton))) # | |
self.PB_Create.clicked.connect(self.on_PB_Create) ### | |
grid.addWidget(self.GBox_05_, 5, 0, 1, 2) #linge, colonne, ligne case, nombre de cases) | |
grid09 = QtWidgets.QGridLayout(self.GBox_05_) | |
grid09.addWidget(self.PB_Quit, 0, 0) | |
grid09.addWidget(self.PB_Del_Last_Line, 0, 1) | |
grid09.addWidget(self.PB_Create, 0, 2) | |
#### #Sortie | |
#### #Info | |
self.frame = QtWidgets.QFrame() | |
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) | |
self.frame.setFrameShadow(QtWidgets.QFrame.Raised) | |
grid.addWidget(self.frame, 6, 0, 1, 3) #ligne, colonne) frame in centralwidget | |
frame01 = QtWidgets.QGridLayout(self.frame) | |
frame01.addWidget(self.label_Info, 0, 0) | |
#### #Info | |
MainWindow.setCentralWidget(self.centralwidget) | |
self.retranslateUi(MainWindow) | |
QtCore.QMetaObject.connectSlotsByName(MainWindow) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_fromUtf8("Connect and Sweep (" + __version__ + ") rmu")) #" " + __date__ + | |
MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8(self.path+'Macro_Connect_And_Sweep.png'))) # change l'icone de la fenetre principale | |
MainWindow.setWindowFlags(PySide2.QtCore.Qt.WindowStaysOnTopHint) # PySide2 cette fonction met la fenetre en avant | |
self.label.setText(_translate("MainWindow", "Connect And Sweep")) | |
# self.PB_Help.setText(_fromUtf8("Help")) | |
self.GBox_00.setTitle(_translate("MainWindow", "Mode")) | |
self.RB_01_BBox_Oject.setText(_translate("MainWindow", "1 : Object + Object")) | |
self.RB_01_BBox_Oject.setToolTip(_fromUtf8("Create the connection to BoundBox center"+"\n" | |
"Center first object selected to center second Object selected"+"\n\n" | |
"If one error of selection is detected the mode change to the mode 3"+"\n" | |
"and the radio button mode 3 is colored in orange to warn you"+"\n")) | |
self.RB_02_BBox_Subo.setText(_translate("MainWindow", "2 : Object + S_Object")) | |
self.RB_02_BBox_Subo.setToolTip(_fromUtf8("Create the connection to BoundBox center"+"\n" | |
"the first selection = Object (BoundBox center)"+"\n" | |
"the second selection = SubObject (BoundBox center of the SubObject)"+"\n\n" | |
"Example: if one line is selected center BoundingBox of the line is the center of line"+"\n" | |
"if one circle is selected center BoundingBox of the circle is the center of circle"+"\n\n" | |
"If one error of selection is detected the mode change to the mode 3"+"\n" | |
"and the radio button mode 3 is colored in orange to warn you"+"\n")) | |
self.RB_03_Subo_Subo.setText(_translate("MainWindow", "3 : S_Object + S_Object")) | |
self.RB_03_Subo_Subo.setToolTip(_fromUtf8("Create the connection to BoundBox center"+"\n" | |
"the first selection = SubObject (BoundBox center of the first SubObject)"+"\n" | |
"the second selection = SubObject (BoundBox center of the second SubObject)"+"\n" | |
"the SubObject can be: "+"\n" | |
"Line, wire, edge, face "+"\n\n" | |
"PS: If only one line is selected the object created follow the DIRECTION of the line or curve"+"\n" | |
"If one circle is selected, one line of length 0 is created"+"\n" | |
"(the points are in point 0 and point 360 and are in the same place.)")) | |
self.label_Info.setText(_translate("MainWindow", __version__ + " " + __date__ + " rmu")) | |
self.label_Info.setToolTip(_fromUtf8("Information of the wire selected :" + "\n" | |
"Number of points created : Length of the wire")) | |
self.GBox_02_.setTitle(_translate("MainWindow", "Sweep Forme")) | |
self.SB_Polyline_Number_Faces.setSuffix(_translate("MainWindow", " num")) | |
self.SB_Polyline_Number_Faces.setToolTip(_fromUtf8("Enter number faces")) | |
self.DS_Polyline_CirCon.setSuffix(_translate("MainWindow", " Cir mm")) | |
self.DS_Polyline_CirCon.setToolTip(_fromUtf8("Radius polygon")) | |
self.RB_Polyline.setText(_translate("MainWindow", "Polygone")) | |
self.CB_Insc_Circon.setText(_translate("MainWindow", "Polygon Circumscribed")) | |
self.CB_Insc_Circon.setToolTip(_fromUtf8("Circumscribed by default, if checked then Inscribed")) | |
self.DS_Rectangle_Y.setSuffix(_translate("MainWindow", " H mm")) | |
self.DS_Rectangle_Y.setToolTip(_fromUtf8("Rectangle Height")) | |
self.DS_Rectangle_X.setSuffix(_translate("MainWindow", " L mm")) | |
self.DS_Rectangle_X.setToolTip(_fromUtf8("Rectangle Length")) | |
self.RB_Rectangle.setText(_translate("MainWindow", "Rectangle")) | |
self.RB_Ellipse.setText(_translate("MainWindow", "Ellipse")) | |
self.DS_Circle_Diameter.setSuffix(_translate("MainWindow", " d mm")) | |
self.DS_Circle_Diameter.setToolTip(_fromUtf8("Diameter of circle")) | |
self.DS_Circle_Radius.setSuffix(_translate("MainWindow", " r mm")) | |
self.DS_Circle_Radius.setToolTip(_fromUtf8("Radius of circle")) | |
self.RB_Circle.setText(_translate("MainWindow", "Circle")) | |
self.RB_Line.setText(_translate("MainWindow", "Line")) | |
self.CB_Solid.setText(_translate("MainWindow", "Solid")) | |
self.CB_Solid.setToolTip(_fromUtf8("Create solid checked by default"+"\n" | |
"If is not checked then is pipe empty (Shell)"+"\n" | |
"If thickness is not 0 the Solid checkBox is checked automatically")) | |
self.label_Pipe.setText(_translate("MainWindow", "Pipe")) | |
self.DS_Pipe.setToolTip(_translate("MainWindow", "thickness of pipe")) | |
self.DS_Pipe.setSuffix(_translate("MainWindow", " Thickness")) | |
self.DS_Pipe.setToolTip(_fromUtf8("Thickness of pipe"+"\n" | |
"If thickness = 0 the object is solid and not pipe"+"\n" | |
"If thickness is larger than a dimension of the object,"+"\n" | |
"thickness is ignored"+"\n" | |
"If this function is used with a Line the LineWidth is affected.")) | |
self.GBox_07_.setTitle(_translate("MainWindow", "Corner point position (on X Y Axis)")) | |
self.RB_Top_Left.setText(_translate("MainWindow", "Top Left")) | |
self.RB_Top_Left.setToolTip(_fromUtf8("The selected point is in the upper left corner"+"\n" | |
"The selection order can reverse the form"+"\n" | |
"Select the objects from the smallest to the largest coordinated")) | |
self.RB_Center_Top.setText(_translate("MainWindow", "Center Top")) | |
self.RB_Center_Top.setToolTip(_fromUtf8("The selected point is the center face Top of the beam")) | |
self.RB_Top_Rigth.setText(_translate("MainWindow", "Top Rigth")) | |
self.RB_Top_Rigth.setToolTip(_fromUtf8("The selected point is in the upper rigth corner"+"\n" | |
"The selection order can reverse the form"+"\n" | |
"Select the objects from the smallest to the largest coordinated")) | |
self.RB_Center_Left.setText(_translate("MainWindow", "Center Left")) | |
self.RB_Center_Left.setToolTip(_fromUtf8("The selected point is the center face Left of the beam")) | |
self.RB_Center_Right.setText(_translate("MainWindow", "Center Right")) | |
self.RB_Center_Right.setToolTip(_fromUtf8("The selected point is the center face Right of the beam")) | |
self.RB_Low_Left.setText(_translate("MainWindow", "Low Left")) | |
self.RB_Low_Left.setToolTip(_fromUtf8("The selected point is in the low left corner"+"\n" | |
"The selection order can reverse the form"+"\n" | |
"Select the objects from the smallest to the largest coordinated")) | |
self.RB_Center_Bottom.setText(_translate("MainWindow", "Center Bottom")) | |
self.RB_Center_Bottom.setToolTip(_fromUtf8("The selected point is the center face Bottom of the beam")) | |
self.RB_Low_Rigth.setText(_translate("MainWindow", "Low Rigth")) | |
self.RB_Low_Rigth.setToolTip(_fromUtf8("The selected point is in the low rigth corner"+"\n" | |
"The selection order can reverse the form"+"\n" | |
"Select the objects from the smallest to the largest coordinated")) | |
self.RB_Center.setText(_translate("MainWindow", "Center")) | |
self.RB_Center.setToolTip(_fromUtf8("The selected point is in the center of forme")) | |
self.GBox_06_.setTitle(_translate("MainWindow", "Options")) | |
self.DS_Discretize.setSuffix(_translate("MainWindow", " sec")) | |
self.DS_Discretize.setToolTip(_fromUtf8("Enter number cut")) | |
self.CB_Discretize.setText(_translate("MainWindow", "Sections")) #Dimension | |
self.CB_Discretize.setToolTip(_fromUtf8("Check this checkBox for choice:" + "\n" | |
"Section (Sec) : the line is cut in x egual sections" + "\n" | |
"Dimension (mm) : the line is cut in x parts with the dimension request")) | |
self.CB_Reverse.setText(_translate("MainWindow", "Reverse")) | |
self.CB_Reverse.setToolTip(_fromUtf8("Check for reverse the order points created" + "\n" | |
"only with the Dimension (mm) option")) | |
self.PB_Del_Points.setText(_translate("MainWindow", "Del last Points")) | |
self.PB_Del_Points.setToolTip(_fromUtf8("Delete the last package of points created")) | |
self.PB_Discretize.setText(_translate("MainWindow", "Process Discretize")) | |
self.PB_Discretize.setToolTip(_fromUtf8("Process the operation creation of points" + "\n" | |
"after discretize")) | |
self.tabWidget.setTabText(self.tabWidget.indexOf(self.TAB_Discretize), _translate("MainWindow", "Discretize Line")) | |
self.PB_Reset_Face.setText(_translate("MainWindow", "Reset")) | |
self.PB_Reset_Face.setToolTip(_fromUtf8("Reset the selection(s) for the Sweep, Loft, Face, Edge or" + "\n" | |
"Duplicate operation BUT not delette the object created")) | |
self.PB_Visibility.setText(_translate("MainWindow", "Visibility")) | |
self.PB_Visibility.setToolTip(_fromUtf8("Restore the visibility" + "\n" | |
"on the all object selected for create a Duplicate button" + "\n" | |
"The button is active for the duplicate objects until" + "\n" | |
"the creation of Sweep (Button)" + "\n" | |
"If the duplication is not used (empty) this button can be used" + "\n" | |
"for hide/display the object selected (only the object selcted)")) | |
self.PB_Create_Face.setText(_translate("MainWindow", "Create Face")) | |
self.PB_Create_Face.setToolTip(_fromUtf8("Create a Face or Edge on S_obect selected" + "\n" | |
"The original object used for create a face or duplicate" + "\n" | |
"is made hidden to access easily on new object created" + "\n" | |
"This function are used by the Sweep tools button")) | |
self.tabWidget.setTabText(self.tabWidget.indexOf(self.Tab_Face), _translate("MainWindow", "Duplicate F/W")) | |
self.PB_Reset_Sweep.setText(_translate("MainWindow", "Reset")) | |
self.PB_Reset_Sweep.setToolTip(_fromUtf8("Reset the selection(s) for the Sweep, Loft, Face, Edge or" + "\n" | |
"Duplicate operation BUT not delette the object created")) | |
self.PB_Del_Sweep.setText(_translate("MainWindow", "Del last Sweep")) | |
self.PB_Del_Sweep.setToolTip(_fromUtf8("Delette the last object created" + "\n" | |
"Sweep, Loft, Edge or Face")) | |
self.PB_Sweep.setText(_translate("MainWindow", "Create Sweep")) | |
self.PB_Sweep.setToolTip(_fromUtf8("Create a sweep with the face(s) created and the path selected" + "\n" | |
"For create the sweep:" + "\n" | |
"create first the face(s) with the Duplicate button" + "\n" | |
"Using this button delette the listing of the names memorised" + "\n" | |
"with the Duplicate button")) | |
self.CB_Solid_Sweep.setText(_translate("MainWindow", "Solid")) | |
self.CB_Solid_Sweep.setToolTip(_fromUtf8("Check for create a Solid Sweep")) | |
self.CB_Frenet_Sweep.setText(_translate("MainWindow", "Frenet")) | |
self.CB_Frenet_Sweep.setToolTip(_fromUtf8("Check for create a Frenet Sweep")) | |
self.tabWidget.setTabText(self.tabWidget.indexOf(self.Tab_Sweep), _translate("MainWindow", "Sweep")) | |
self.PB_Reset_Loft.setText(_translate("MainWindow", "Reset")) | |
self.PB_Reset_Loft.setToolTip(_fromUtf8("Reset the selection(s) for the Sweep, Loft, Face, Edge or" + "\n" | |
"Duplicate operation BUT not delette the object created")) | |
self.PB_Del_Loft.setText(_translate("MainWindow", "Del last Loft")) | |
self.PB_Del_Loft.setToolTip(_fromUtf8("Delette the last object created" + "\n" | |
"Sweep, Loft, Edge or Face")) | |
self.PB_Loft.setText(_translate("MainWindow", "Create Loft")) | |
self.PB_Loft.setToolTip(_fromUtf8("Create a loft with the face(s) created" + "\n" | |
"For create the loft:" + "\n" | |
"create first the face(s) with the Duplicate button" + "\n" | |
"Using this button delette the listing of the names memorised" + "\n" | |
"with the Duplicate button")) | |
self.CB_Solid_Loft.setText(_translate("MainWindow", "Solid")) | |
self.CB_Solid_Loft.setToolTip(_fromUtf8("Check for create a Solid Loft")) | |
self.CB_Ruled_Loft.setText(_translate("MainWindow", "Ruled")) | |
self.CB_Ruled_Loft.setToolTip(_fromUtf8("Check for create a Ruled Loft")) | |
self.CB_Closed_Loft.setText(_translate("MainWindow", "Closed")) | |
self.CB_Closed_Loft.setToolTip(_fromUtf8("Check for create a Closed Loft")) | |
self.tabWidget.setTabText(self.tabWidget.indexOf(self.Tab_Loft), _translate("MainWindow", "Loft")) | |
self.GBox_05_.setTitle(_translate("MainWindow", "Command")) | |
self.PB_Create.setText(_translate("MainWindow", "Create Solid")) | |
self.PB_Create.setToolTip(_fromUtf8("Create the sweep or line")) | |
self.PB_Del_Last_Line.setText(_translate("MainWindow", "Del last Line")) | |
self.PB_Del_Last_Line.setToolTip(_fromUtf8("If the last form is not in the right direction" + "\n" | |
"you can delete it easily")) | |
self.PB_Quit.setText(_translate("MainWindow", "Quit")) | |
self.PB_Quit.setToolTip(_fromUtf8("Quit Connect And Sweep")) | |
def on_PB_Help(self): # | |
try: | |
webbrowser.open(__Wiki__) | |
App.Console.PrintMessage(__Wiki__ + "\n") | |
except Exception: | |
App.Console.PrintMessage(u"Not access") | |
def colorThickness(self,value): # 0= couleur de Base , 1= couleur rouge | |
global ui | |
if (self.Thickness != 0.0): | |
if value != 0: | |
############### font and color modified | |
self.Thickness = 0.0 | |
self.DS_Pipe.setValue(self.Thickness) | |
palette = QtGui.QPalette() | |
brush = QtGui.QBrush(QtGui.QColor(255, 0, 0)) | |
brush.setStyle(QtCore.Qt.SolidPattern) | |
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) | |
font = QtGui.QFont() | |
font.setBold(True) | |
font.setWeight(75) | |
self.DS_Pipe.setPalette(palette) # DSpinbox | |
self.DS_Pipe.setFont(font) # DSpinbox | |
App.Console.PrintWarning("Thickness aborded" + "\n") | |
self.label_Info.setText(_fromUtf8("Thickness aborded")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
############### font and color modified | |
else: | |
############### font and color base | |
palette = QtGui.QPalette() | |
brush = QtGui.QBrush(QtGui.QColor("Base")) | |
brush.setStyle(QtCore.Qt.SolidPattern) | |
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) | |
font = QtGui.QFont() | |
font.setBold(False) | |
self.DS_Pipe.setPalette(palette) # DSpinbox | |
self.DS_Pipe.setFont(font) # DSpinbox | |
############### | |
def on_RB_00_Mode_clicked(self): | |
self.RB_01_BBox_Oject.setStyleSheet("background-color: QPalette.Base")# origin system | |
self.RB_02_BBox_Subo.setStyleSheet("background-color: QPalette.Base") # origin system | |
self.RB_03_Subo_Subo.setStyleSheet("background-color: QPalette.Base") # origin system | |
def on_SB_Polyline_Number_Faces(self,value): | |
self.Polyline_Number_Faces = value | |
def on_DS_Circle_Radius(self,value): | |
self.Circle_Radius = value | |
self.Circle_Diameter = self.Circle_Radius * 2.0 | |
self.DS_Circle_Diameter.setValue(self.Circle_Diameter) | |
def on_DS_Circle_Diameter(self,value): | |
self.Circle_Diameter = value | |
self.Circle_Radius = self.Circle_Diameter / 2.0 | |
self.DS_Circle_Radius.setValue(self.Circle_Radius) | |
def on_DS_Polyline_CirCon(self,value): | |
self.Polyline_CirCon = value | |
def on_DS_Rectangle_X(self,value): | |
self.Rectangle_X = value | |
def on_DS_Rectangle_Y(self,value): | |
if value > self.Rectangle_X: | |
value = self.Rectangle_X | |
self.DS_Rectangle_Y.setValue(value) | |
self.Rectangle_Y = value | |
def on_DS_Pipe(self,value): | |
global ui | |
self.Thickness = value | |
if self.Thickness != 0.0: | |
self.CB_Solid.setChecked(True) | |
self.PB_Create.setText("Create Solid") | |
self.CB_Solid.setText(_fromUtf8("Solid")) | |
if self.RB_Polyline.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Pipe Polyline")) | |
elif self.RB_Rectangle.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Pipe Rectangle")) | |
elif self.RB_Ellipse.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Pipe Ellipse")) | |
elif self.RB_Circle.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Pipe Circle")) | |
elif self.RB_Line.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Width Line")) | |
else: | |
self.CB_Solid.setChecked(True) | |
if self.RB_Polyline.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Solid Polyline")) | |
elif self.RB_Rectangle.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Solid Rectangle")) | |
elif self.RB_Ellipse.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Solid Ellipse")) | |
elif self.RB_Circle.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Solid Circle")) | |
elif self.RB_Line.isChecked(): | |
self.PB_Create.setText(_fromUtf8("Create Line")) | |
ff = ui | |
ff.colorThickness(0) | |
def on_CB_Insc_Circon_clicked(self): | |
if self.CB_Insc_Circon.isChecked(): | |
self.DS_Polyline_CirCon.setSuffix(" Ins mm") | |
self.CB_Insc_Circon.setText(_fromUtf8("Polygon Inscribed")) | |
else: | |
self.DS_Polyline_CirCon.setSuffix(" Cir mm") | |
self.CB_Insc_Circon.setText(_fromUtf8("Polygon Circumscribed")) | |
def on_CB_Solid_clicked(self): | |
global ui | |
if self.CB_Solid.isChecked(): | |
self.PB_Create.setText("Create Solid") | |
self.CB_Solid.setText(_fromUtf8("Solid")) | |
else: | |
self.PB_Create.setText("Create Empty (Shell)") | |
self.CB_Solid.setText(_fromUtf8("Shell")) | |
if self.Thickness != 0.0: | |
self.CB_Solid.setChecked(True) | |
ui.on_DS_Pipe(self.Thickness) | |
def on_RB_Polyline_clicked(self): | |
global ui | |
self.GBox_07_.setVisible(False) | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
FreeCADGui.updateGui() # rafraichi l'ecran | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
if self.RB_Polyline.isChecked(): | |
ui.on_DS_Pipe(self.Thickness) | |
self.DS_Circle_Radius.setVisible(True) | |
self.DS_Circle_Diameter.setVisible(True) | |
self.label_Pipe.setText(_fromUtf8("Pipe")) | |
def on_RB_Rectangle_clicked(self): | |
global ui | |
ui.on_DS_Pipe(self.Thickness) | |
MainWindow.resize(750, 570) | |
self.GBox_07_.setVisible(True) | |
self.grid03.addWidget(self.DS_Rectangle_X, 2, 1) | |
self.grid03.addWidget(self.DS_Rectangle_Y, 2, 2) | |
self.DS_Rectangle_X.setSuffix(" L mm") | |
self.DS_Rectangle_Y.setSuffix(" H mm") | |
self.DS_Rectangle_X.setToolTip(_fromUtf8("Rectangle Length")) | |
self.DS_Rectangle_Y.setToolTip(_fromUtf8("Rectangle Height")) | |
self.label_Pipe.setText(_fromUtf8("Pipe")) | |
def on_RB_Ellipse_clicked(self): | |
global ui | |
ui.on_DS_Pipe(self.Thickness) | |
MainWindow.resize(750, 570) | |
self.GBox_07_.setVisible(True) | |
self.grid03.addWidget(self.DS_Rectangle_X, 3, 1) | |
self.grid03.addWidget(self.DS_Rectangle_Y, 3, 2) | |
self.DS_Rectangle_X.setSuffix(" R mm") | |
self.DS_Rectangle_Y.setSuffix(" r mm") | |
self.DS_Rectangle_X.setToolTip(_fromUtf8("Ellipse MajorRadius")) | |
self.DS_Rectangle_Y.setToolTip(_fromUtf8("Ellipse MinorRadius")) | |
self.label_Pipe.setText(_fromUtf8("Pipe")) | |
def on_RB_Image_clicked(self): | |
pic = QtGui.QPixmap() | |
if self.RB_Top_Left.isChecked(): | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_TL)) | |
elif self.RB_Top_Rigth.isChecked(): | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_TR)) | |
elif self.RB_Low_Left.isChecked(): | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_LL)) | |
elif self.RB_Low_Rigth.isChecked(): | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_LR)) | |
elif self.RB_Center.isChecked(): | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_CE)) | |
elif self.RB_Center_Top.isChecked(): # center dessus poutrelle | |
pic.loadFromData(base64.b64decode(CenterTop_b64)) | |
elif self.RB_Center_Right.isChecked(): # Rectangle Center_Right | |
pic.loadFromData(base64.b64decode(CenterRigth_b64)) | |
elif self.RB_Center_Left.isChecked(): # Rectangle Center Left | |
pic.loadFromData(base64.b64decode(CenterLeft_b64)) | |
elif self.RB_Center_Bottom.isChecked(): # Rectangle Center Bottom | |
pic.loadFromData(base64.b64decode(CenterBottom_b64)) | |
else: | |
pic.loadFromData(base64.b64decode(Macro_Connect_And_Sweep_CE)) | |
self.scene = QtWidgets.QGraphicsScene() | |
self.scene.addPixmap(QtGui.QPixmap(pic)) | |
self.graphicsView.setScene(self.scene) | |
def on_RB_Circle_clicked(self): | |
global ui | |
self.GBox_07_.setVisible(False) | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
FreeCADGui.updateGui() # rafraichi l'ecran | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
if self.RB_Circle.isChecked(): | |
ui.on_DS_Pipe(self.Thickness) | |
self.label_Pipe.setText(_fromUtf8("Pipe")) | |
def on_RB_Line_clicked(self): | |
global ui | |
self.GBox_07_.setVisible(False) | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
FreeCADGui.updateGui() # rafraichi l'ecran | |
MainWindow.resize(QtCore.QSize(360, 570)) | |
if self.RB_Line.isChecked(): | |
ui.on_DS_Pipe(self.Thickness) | |
self.label_Pipe.setText(_fromUtf8("Line")) | |
def on_DS_Discretize(self, value): | |
if self.CB_Discretize.isChecked(): | |
self.discretize = float(value) | |
else: | |
self.discretize = int(value) | |
self.DS_Discretize.setValue(self.discretize) | |
def on_CB_Discretize_clicked(self): | |
if self.CB_Discretize.isChecked(): | |
self.DS_Discretize.setMinimum(0.000001) | |
self.DS_Discretize.setMaximum(999999) | |
self.DS_Discretize.setDecimals(3) | |
self.DS_Discretize.setSuffix(" mm") | |
self.DS_Discretize.setValue(float(self.discretize)) | |
self.CB_Discretize.setText(_fromUtf8("Dimension")) | |
self.CB_Reverse.setEnabled(True) | |
else: | |
self.DS_Discretize.setMinimum(1) | |
self.DS_Discretize.setMaximum(999999) | |
self.DS_Discretize.setDecimals(0) | |
self.DS_Discretize.setSuffix(" Sec") | |
self.discretize = int(self.discretize) | |
self.CB_Discretize.setText(_fromUtf8("Sections")) | |
self.CB_Reverse.setEnabled(False) | |
self.CB_Reverse.setChecked(False) | |
self.DS_Discretize.setValue(self.discretize) | |
def on_CB_Reverse(self): | |
None | |
def on_PB_Del_Points(self): | |
try: | |
FreeCAD.ActiveDocument.getObject(self.CASweep.Name).removeObjectsFromDocument() | |
FreeCAD.ActiveDocument.removeObject(self.CASweep.Name) | |
#01 for de in self.nameL: | |
#01 FreeCAD.ActiveDocument.removeObject(de) | |
#01 del self.nameL[:] | |
except Exception: | |
None | |
def on_PB_Discretize(self): | |
try: | |
selD = FreeCADGui.Selection.getSelectionEx() | |
longueur = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].Length | |
subElementName = Gui.Selection.getSelectionEx()[0].SubElementNames[0] | |
self.CASweep = App.activeDocument().addObject("App::DocumentObjectGroup","CASweep_" + subElementName) | |
#01 self.nameL = [] | |
#01 del self.nameL[:] | |
if self.CB_Discretize.isChecked(): | |
if self.CB_Reverse.isChecked(): #reverse | |
debutLine = selD[0].SubObjects[0].Edges[0].Vertexes[0].Point | |
finLine = selD[0].SubObjects[0].Edges[0].Vertexes[1].Point | |
lineReverse = Part.LineSegment(finLine, debutLine).toShape() | |
Part.show(lineReverse) | |
lineReverse = Part.LineSegment(finLine, debutLine).toShape() | |
pointsDirection = lineReverse.discretize(Distance = self.discretize) # distance en mm reverse | |
FreeCAD.ActiveDocument.removeObject(App.ActiveDocument.ActiveObject.Name) | |
else: #Forward | |
pointsDirection = selD[0].SubObjects[0].discretize(Distance = self.discretize) # distance en mm nomal | |
else: | |
pointsDirection = selD[0].SubObjects[0].discretize(self.discretize + 1) # nombre de coupes | |
for i in pointsDirection: | |
point = Draft.makePoint(i) | |
FreeCADGui.ActiveDocument.getObject(point.Name).PointColor = (1.0,0.0,0.0) | |
self.CASweep.addObject(point) # conteneur dossier points | |
#01 self.nameL.append(point.Name) | |
FreeCAD.ActiveDocument.recompute() | |
#01 self.label_Info.setText(_fromUtf8("Number points : " + str(len(pointsDirection)) + " ; Length wire : " + str(round(longueur,3)))) | |
except Exception: | |
App.Console.PrintError("Error Discretize !" + "\n") | |
self.label_Info.setText(_fromUtf8("Error Discretize !")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
FreeCAD.ActiveDocument.recompute() | |
def on_PB_Create_Face(self): | |
try: | |
sel = FreeCADGui.Selection.getSelection() | |
self.ElementName = FreeCADGui.Selection.getSelection()[0].Name | |
subElementName = Gui.Selection.getSelectionEx()[0].SubElementNames[0] | |
try: | |
Gui.runCommand('Part_ElementCopy',0) #ici pour la FC 0.19 et + use the FC feature | |
except Exception : | |
Part.show(FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy()) # create repro shape subObject | |
try: | |
if (str(sel[0].InList[0]) == "<body object>") or (str(sel[0].InList[0]) == "<Part object>"): | |
objectRealPlacement3DX, objectPlacementAngle = objectRealPlacement3D(FreeCAD.ActiveDocument.getObject(self.ElementName))# search the original Placement | |
a = App.ActiveDocument.ActiveObject #ici avec la FC 0.18 | |
a.Placement = App.Placement(App.Vector(objectRealPlacement3DX), App.Rotation(objectPlacementAngle[0], objectPlacementAngle[1], objectPlacementAngle[2]), App.Vector(0,0,0)) | |
else: | |
None | |
except Exception: | |
None | |
App.ActiveDocument.ActiveObject.Label = App.ActiveDocument.ActiveObject.Label + "_" + subElementName | |
FreeCADGui.activeDocument().getObject(self.ElementName).Visibility = False | |
try: | |
FreeCADGui.activeDocument().activeObject().LineColor = (1.0,0.0,0.0) # give LineColor | |
FreeCADGui.activeDocument().activeObject().PointColor = (1.0,0.0,0.0) # give PointColor | |
FreeCADGui.activeDocument().activeObject().ShapeColor = (1.0,0.0,0.0) # give ShapeColor | |
except Exception: | |
None | |
if self.ElementName in self.selectForDuplicate: | |
None | |
else: | |
self.selectForDuplicate.append(self.ElementName) | |
FreeCAD.ActiveDocument.recompute() | |
self.PB_Reset_Sweep.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Loft.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Face.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Visibility.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Sweep.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Loft.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Face.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
except Exception: | |
None | |
App.ActiveDocument.recompute() | |
def on_PB_Visibility(self): # after created face | |
try: | |
if len(self.selectForDuplicate) == 0: | |
self.ElementName = FreeCADGui.Selection.getSelection()[0].Name | |
if FreeCADGui.activeDocument().getObject(self.ElementName).Visibility == True: | |
FreeCADGui.activeDocument().getObject(self.ElementName).Visibility = False | |
else: | |
FreeCADGui.activeDocument().getObject(self.ElementName).Visibility = True | |
else: | |
for visible in self.selectForDuplicate: | |
if FreeCADGui.activeDocument().getObject(visible).Visibility == True: | |
FreeCADGui.activeDocument().getObject(visible).Visibility = False | |
else: | |
FreeCADGui.activeDocument().getObject(visible).Visibility = True | |
except Exception: | |
None | |
def on_PB_Reset_Sweep(self): # Sweep or Duplicate or Face or Loft (self.selectForDuplicate) | |
for visible in self.selectForDuplicate: #restore the visible objects | |
FreeCADGui.activeDocument().getObject(visible).Visibility = True | |
self.selectForDuplicate = [] | |
self.PB_Reset_Sweep.setText(_fromUtf8("Reset")) | |
self.PB_Reset_Loft.setText(_fromUtf8("Reset")) | |
self.PB_Reset_Face.setText(_fromUtf8("Reset")) | |
self.PB_Visibility.setStyleSheet("Base") | |
self.PB_Reset_Sweep.setStyleSheet("Base") | |
self.PB_Reset_Loft.setStyleSheet("Base") | |
self.PB_Reset_Face.setStyleSheet("Base") | |
def on_PB_Del_Sweep(self): | |
try: | |
FreeCAD.ActiveDocument.removeObject(self.sweepFaceName) | |
except Exception: | |
None | |
def on_PB_Sweep(self): # | |
try: | |
selForSweep = FreeCADGui.Selection.getSelection() | |
subElementSweep = Gui.Selection.getSelectionEx()[len(selForSweep)-1].SubElementNames[0] | |
#if (selForSweep[0].Shape.ShapeType == "Face"): | |
#else: | |
# print("Error selection : ",selForSweep[0].Shape.ShapeType," ",selForSweep[1].Shape.ShapeType) | |
if len(selForSweep) > 1: | |
sweepFace = FreeCAD.ActiveDocument.addObject('Part::Sweep','Sweep') | |
self.sweepFaceName = sweepFace.Name | |
sweepFace.Sections = [FreeCAD.ActiveDocument.getObject(o.Name) for o in selForSweep[:-1]] | |
sweepFace.Spine = FreeCAD.ActiveDocument.getObject(selForSweep[-1].Name),[subElementSweep] | |
if self.CB_Solid_Sweep.isChecked(): | |
sweepFace.Solid = True | |
else: | |
sweepFace.Solid = False | |
if self.CB_Frenet_Sweep.isChecked(): | |
sweepFace.Frenet = True | |
else: | |
sweepFace.Frenet = False | |
sweepFace.Label = selForSweep[0].Label + "_" + selForSweep[-1].Name | |
for visible in self.selectForDuplicate: #restore the visible objects | |
FreeCADGui.activeDocument().getObject(visible).Visibility = True | |
self.selectForDuplicate = [] | |
self.PB_Reset_Sweep.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Loft.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Face.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Visibility.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Sweep.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Loft.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Face.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
except Exception: | |
try: | |
FreeCAD.ActiveDocument.removeObject(self.sweepFaceName) | |
except Exception: | |
None | |
App.ActiveDocument.recompute() | |
def on_PB_Loft(self): | |
try: | |
selForLoft = FreeCADGui.Selection.getSelection() | |
subElementSweep = Gui.Selection.getSelectionEx()[len(selForLoft)-1].SubElementNames[0] | |
#if (selForLoft[0].Shape.ShapeType == "Face"): | |
#else: | |
# print("Error selection : ",selForLoft[0].Shape.ShapeType," ",selForLoft[1].Shape.ShapeType) | |
if len(selForLoft) > 1: | |
loftFace = FreeCAD.ActiveDocument.addObject('Part::Loft','Loft') | |
self.sweepFaceName = loftFace.Name | |
loftFace.Sections = [FreeCAD.ActiveDocument.getObject(o.Name) for o in selForLoft] | |
if self.CB_Solid_Loft.isChecked(): | |
loftFace.Solid = True | |
else: | |
loftFace.Solid = False | |
if self.CB_Ruled_Loft.isChecked(): | |
loftFace.Ruled = True | |
else: | |
loftFace.Closed = False | |
if self.CB_Closed_Loft.isChecked(): | |
loftFace.Closed = True | |
else: | |
loftFace.Closed = False | |
loftFace.Label = selForLoft[0].Label + "_" + selForLoft[-1].Name | |
for visible in self.selectForDuplicate: #restore the visible objects | |
FreeCADGui.activeDocument().getObject(visible).Visibility = True | |
self.selectForDuplicate = [] | |
self.PB_Reset_Sweep.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Loft.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Reset_Face.setText(_fromUtf8("Reset " + str(len(self.selectForDuplicate)))) | |
self.PB_Visibility.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Sweep.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Loft.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
self.PB_Reset_Face.setStyleSheet("background-color: white;\n" | |
"border:2px solid rgb(115, 210, 22);") # bord white and green | |
except Exception: | |
try: | |
FreeCAD.ActiveDocument.removeObject(self.sweepFaceName) | |
except Exception: | |
None | |
App.ActiveDocument.recompute() | |
def on_PB_Quit(self): # Quit | |
App.Console.PrintMessage(str("Fin Connect And Sweep ")+"\n") | |
self.window.hide() | |
def on_PB_Del_Last_Line(self): # Del Last Line | |
self.label_Info.setStyleSheet("QPalette.Base") # origin system | |
self.label_Info.setText(_fromUtf8( __version__ + " " + __date__ + " rmu")) | |
try: | |
FreeCAD.ActiveDocument.getObject(self.FcSweep.Name).removeObjectsFromDocument() | |
FreeCAD.ActiveDocument.removeObject(self.FcSweep.Name) | |
except Exception: | |
self.PB_Del_Last_Line.setText(_fromUtf8("?")) | |
None | |
def on_PB_Create(self): # Create | |
try: | |
if len(Gui.Selection.getSelection()) >= 1: | |
self.label_Info.setStyleSheet("QPalette.Base") # origin system | |
self.label_Info.setText(_fromUtf8( __version__ + " " + __date__ + " rmu")) | |
if self.RB_01_BBox_Oject.isChecked(): # Obj Obj | |
boundBox_0 = Gui.Selection.getSelection()[0].Shape.BoundBox.Center # Object 1 is Object BBox | |
boundBox_0 = boundBox_0.add(objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB"))#### | |
try: | |
boundBox_1 = Gui.Selection.getSelection()[1].Shape.BoundBox.Center # Object 2 is Object BBox | |
boundBox_1 = boundBox_1.add(objectRealPlacement3D(Gui.Selection.getSelection()[1],0,"BB"))#### | |
except Exception: | |
self.RB_03_Subo_Subo.setChecked(True) | |
self.RB_03_Subo_Subo.setStyleSheet("background-color: #f57900 ") | |
FreeCAD.Console.PrintError("Bad selection or 1 object selected instead 2 in mode BBox Obj Obj"+"\n" | |
"mode changed to mode 3 BBox SObj. SObj. "+"\n") | |
#print("1") | |
elif self.RB_02_BBox_Subo.isChecked(): # Obj SObj | |
boundBox_0 = Gui.Selection.getSelection()[0].Shape.BoundBox.Center # Object 2 is Object BBox | |
boundBox_0 = boundBox_0.add(objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB"))#### | |
try: | |
boundBox_1 = Gui.Selection.getSelectionEx()[1].SubObjects[0].BoundBox.Center # object 1 is subObject BBCenter | |
boundBox_1 = boundBox_1.add(objectRealPlacement3D(Gui.Selection.getSelection()[1],0,"BB"))# | |
except Exception: | |
self.RB_03_Subo_Subo.setChecked(True) | |
self.RB_03_Subo_Subo.setStyleSheet("background-color: #f57900 ") | |
FreeCAD.Console.PrintError("Bad selection or 1 object selected instead 2 in mode BBox Obj SObj"+"\n" | |
"mode changed to mode 3 BBox SObj. SObj. "+"\n") | |
#print("2") | |
if self.RB_03_Subo_Subo.isChecked(): # SObj SObj | |
boundBox_0 = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox.Center # object 1 is subObject BBCenter | |
boundBox_0 = boundBox_0.add(objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB"))# | |
#print("11") | |
try: | |
boundBox_1 = Gui.Selection.getSelectionEx()[0].SubObjects[1].BoundBox.Center # object 2 is subObject BBCenter | |
boundBox_1 = boundBox_1.add(objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB"))# | |
#print("12") | |
except Exception: | |
try: | |
boundBox_1 = Gui.Selection.getSelectionEx()[1].SubObjects[0].BoundBox.Center # object 2 is subObject BBCenter | |
boundBox_1 = boundBox_1.add(objectRealPlacement3D(Gui.Selection.getSelection()[1],0,"BB"))# | |
#print("13") | |
except Exception: | |
try: | |
originalPosition_01 = objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB") | |
originalPosition_02 = objectRealPlacement3D(Gui.Selection.getSelection()[0],0,"BB") | |
points = Gui.Selection.getSelectionEx()[0].SubObjects[0].Edges[0].discretize(3) # single object (Line) | |
boundBox_0 = originalPosition_01.add(points[0]) | |
boundBox_1 = originalPosition_02.add(points[2]) | |
#print("14") | |
except Exception: | |
App.Console.PrintMessage("Error selection SObj SObj" + "\n")# | |
self.label_Info.setText(_fromUtf8("Error selection SObj SObj")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
try: | |
points=[FreeCAD.Vector(boundBox_0),FreeCAD.Vector(boundBox_1)] # coordinates | |
self.ligne = Draft.makeWire(points,closed=False,face=False,support=None) # create line directrice | |
self.ligne.Label = "Line_Master" | |
App.Console.PrintMessage("Object 0 : " + str(boundBox_0) + "\n") # coordinates displayed | |
App.Console.PrintMessage("Object 1 : " + str(boundBox_1) + "\n") # coordinates displayed | |
self.label_Info.setText(_fromUtf8("Object 0 : " + str(boundBox_0) + " Object 1 : " + str(boundBox_1))) | |
try: | |
direction = boundBox_1.sub(boundBox_0) | |
App.Console.PrintMessage("Direction : " + str(direction) + "\n") # direction displayed | |
except Exception: | |
None | |
try: | |
App.Console.PrintMessage("Distance point to point : " + str(DraftVecUtils.dist(boundBox_0, boundBox_1)) + "\n")# length point to point | |
self.label_Info.setText(_fromUtf8("Distance point to point : " + str(DraftVecUtils.dist(boundBox_0, boundBox_1)))) | |
except Exeption: | |
None | |
App.Console.PrintMessage("_______________________" + "\n")# | |
##### create Line | |
#self.PB_Del_Last_Line.setEnabled(True) | |
if self.RB_Line.isChecked(): | |
if (self.Thickness != 0.0): | |
FreeCADGui.ActiveDocument.getObject(self.ligne.Name).LineWidth = self.Thickness | |
self.ligne.Label = "Line_Master_" + str(self.Thickness) | |
#self.PB_Del_Last_Line.setEnabled(False) | |
#self.PB_Del_Last_Line.setText(_fromUtf8("!")) | |
App.ActiveDocument.recompute() | |
else: | |
##### section camera view get origin | |
OriginOrientation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation() | |
##### section camera alignement to points | |
v=boundBox_1.sub(boundBox_0) | |
r=App.Rotation(App.Vector(0,0,1),v) | |
FreeCADGui.ActiveDocument.ActiveView.setCameraOrientation(r.Q) | |
##### create Placement | |
pl = "" | |
pl = FreeCAD.Placement() | |
pl.Rotation.Q = (r.Q[0],r.Q[1],r.Q[2],r.Q[3]) | |
pl.Base = FreeCAD.Vector(boundBox_0[0],boundBox_0[1],boundBox_0[2]) | |
##### create Polyline | |
if self.RB_Polyline.isChecked(): | |
if self.Polyline_CirCon == 0: self.Polyline_CirCon = 1.0 | |
if self.CB_Insc_Circon.isChecked(): | |
self.Forme = Draft.makePolygon(self.Polyline_Number_Faces ,radius=self.Polyline_CirCon,inscribed=True,placement=pl,face=False,support=None) # Draft | |
else: | |
self.Forme = Draft.makePolygon(self.Polyline_Number_Faces ,radius=self.Polyline_CirCon,inscribed=False,placement=pl,face=False,support=None) # Draft | |
self.Forme.Placement = pl | |
##### tube a soustraire Polyline | |
if (self.Thickness != 0.0) and (self.Thickness < self.Polyline_CirCon): | |
if self.CB_Insc_Circon.isChecked(): | |
self.FormeSubtract = Draft.makePolygon(self.Polyline_Number_Faces ,radius=(self.Polyline_CirCon-self.Thickness),inscribed=True,placement=pl,face=False,support=None) # Draft | |
else: | |
self.FormeSubtract = Draft.makePolygon(self.Polyline_Number_Faces ,radius=(self.Polyline_CirCon-self.Thickness),inscribed=False,placement=pl,face=False,support=None) # Draft | |
self.FormeSubtract.Placement = pl | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Polyline | |
self.PB_Del_Last_Line.setText(_fromUtf8("Del Polygon")) | |
##### create Rectangle | |
elif self.RB_Rectangle.isChecked(): | |
XS = self.Rectangle_X-(self.Thickness * 2) | |
YS = self.Rectangle_Y-(self.Thickness * 2) | |
if self.RB_Center.isChecked(): | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X/2),-(self.Rectangle_Y/2),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment and centrage | |
##### tube a soustraire Rectangle centre | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-((XS)/2),-((YS)/2),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle centre | |
elif self.RB_Top_Left.isChecked(): | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector((0.0),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Left | |
##### tube a soustraire Rectangle Top_Left | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector((self.Thickness),-(self.Rectangle_Y-self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Top_Left | |
elif self.RB_Top_Rigth.isChecked(): | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Rigth | |
##### tube a soustraire Rectangle Top_Rigth | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-(self.Rectangle_X-self.Thickness),-(self.Rectangle_Y-self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Top_Rigth | |
elif self.RB_Low_Left.isChecked(): | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(0.0,0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Left | |
##### tube a soustraire Rectangle Low_Left | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector((self.Thickness),(self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Low_Left | |
elif self.RB_Low_Rigth.isChecked(): | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Rigth | |
##### tube a soustraire Rectangle Low_Rigth | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
XS = self.Rectangle_X-(self.Thickness * 2) | |
YS = self.Rectangle_Y-(self.Thickness * 2) | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-(self.Rectangle_X-self.Thickness),(self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Low_Rigth | |
elif self.RB_Center_Top.isChecked(): # center dessus poutrelle | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X/2.0),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Left | |
##### tube a soustraire Rectangle center dessus poutrelle | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-(self.Rectangle_X/2.0)+(self.Thickness),-((self.Rectangle_Y)-self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle center dessus poutrelle | |
elif self.RB_Center_Right.isChecked(): # Rectangle Center_Right | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),-(self.Rectangle_Y/2.0),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Rigth | |
##### tube a soustraire Rectangle Center_Rigth | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-(self.Rectangle_X-self.Thickness),-((self.Rectangle_Y/2.0)-self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Center_Rigth | |
elif self.RB_Center_Left.isChecked(): # Rectangle Center Left | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(0.0,-(self.Rectangle_Y/2.0),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Left | |
##### tube a soustraire Rectangle Center Left | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector((self.Thickness),-(self.Rectangle_Y/2.0)+(self.Thickness),(0.0)), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Center Left | |
elif self.RB_Center_Bottom.isChecked(): # Rectangle Center Bottom | |
self.Forme = Draft.makeRectangle(length=self.Rectangle_X,height=self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X/2.0),(0.0),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Rigth | |
##### tube a soustraire Rectangle Center Bottom | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
XS = self.Rectangle_X-(self.Thickness * 2) | |
YS = self.Rectangle_Y-(self.Thickness * 2) | |
self.FormeSubtract = Draft.makeRectangle(length=XS,height=YS,placement=App.Placement(App.Vector(-(self.Rectangle_X/2.0) + self.Thickness,(self.Thickness),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Rectangle Center Bottom | |
self.PB_Del_Last_Line.setText(_fromUtf8("Del Rectangle")) | |
##### create Ellipse | |
elif self.RB_Ellipse.isChecked(): | |
if self.Rectangle_X == 0: self.Rectangle_X = 1.0 | |
if self.Rectangle_Y == 0: self.Rectangle_Y = 1.0 | |
XS = self.Rectangle_X-(self.Thickness ) | |
YS = self.Rectangle_Y-(self.Thickness ) | |
if self.RB_Center.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=pl,face=False,support=None) | |
self.Forme.Placement = pl # centrage | |
##### tube a soustraire Ellipse centre | |
if (self.Thickness != 0.0) and ((self.Thickness) < self.Rectangle_X) and ((self.Thickness) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=pl,face=False,support=None) | |
self.FormeSubtract.Placement.Rotation = App.Rotation(0.0,0.0,0.0) | |
self.FormeSubtract.Placement = pl | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse centre | |
elif self.RB_Top_Left.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector((self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Left | |
##### tube a soustraire Ellipse Top_Left | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector((self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Top_Left | |
elif self.RB_Top_Rigth.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Top_Rigth | |
##### tube a soustraire Ellipse Top_Rigth | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector(-(self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Top_Rigth | |
elif self.RB_Low_Left.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector((self.Rectangle_X),(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Left | |
##### tube a soustraire Ellipse Low_Left | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector((self.Rectangle_X),(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Low_Left | |
elif self.RB_Low_Rigth.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Low_Rigth | |
##### tube a soustraire Ellipse Low_Rigth | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector(-(self.Rectangle_X),(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Low_Rigth | |
elif self.RB_Center_Top.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector((self.Rectangle_X),-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(App.Placement(App.Vector(0.0,-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0,0,0))) # centrage Bord superieur | |
##### tube a soustraire Ellipse Top_Center | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector(0.0,-(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Top_Center | |
elif self.RB_Center_Bottom.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector(0.0,0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(App.Placement(App.Vector(0.0,(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0,0,0))) # centrage Bord superieur | |
##### tube a soustraire Ellipse Bas_Center | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector(0.0,(self.Rectangle_Y),0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Bas_Center | |
elif self.RB_Center_Left.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector((self.Rectangle_X),0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Left_Center | |
##### tube a soustraire Ellipse Left_Center | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector((self.Rectangle_X),0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Left_Center | |
elif self.RB_Center_Right.isChecked(): | |
self.Forme = Draft.makeEllipse(self.Rectangle_X,self.Rectangle_Y,placement=App.Placement(App.Vector(-(self.Rectangle_X),0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.Forme.Placement = pl.multiply(self.Forme.Placement) # increment Rigth_Center | |
##### tube a soustraire Ellipse Rigth_Center | |
if (self.Thickness != 0.0) and ((self.Thickness*2) < self.Rectangle_X) and ((self.Thickness*2) < self.Rectangle_Y): | |
self.FormeSubtract = Draft.makeEllipse(XS,YS,placement=App.Placement(App.Vector(-(self.Rectangle_X),0.0,0.0), App.Rotation(0.0,0.0,0.0), App.Vector(0.0,0.0,0.0)),face=False,support=None) | |
self.FormeSubtract.Placement = pl.multiply(self.FormeSubtract.Placement) | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Ellipse Rigth_Center | |
self.PB_Del_Last_Line.setText(_fromUtf8("Del Ellipse")) | |
##### create Circle | |
elif self.RB_Circle.isChecked(): | |
if self.Circle_Radius == 0: self.Circle_Radius = 1.0 | |
self.Forme = Draft.makeCircle(radius=self.Circle_Radius,placement=pl,face=False,support=None) | |
self.Forme.Placement = pl | |
##### tube a soustraire Circle | |
if (self.Thickness != 0.0) and (self.Thickness < self.Circle_Radius): | |
self.Circle_Radius_Sbs = self.Circle_Radius - (self.Thickness) | |
self.FormeSubtract = Draft.makeCircle(radius=self.Circle_Radius_Sbs,placement=pl,face=False,support=None) | |
self.FormeSubtract.Placement = pl | |
else: | |
ff = ui | |
ff.colorThickness(1) | |
##### tube a soustraire Circle | |
self.PB_Del_Last_Line.setText(_fromUtf8("Del Circle")) | |
##### create sweep self.Forme externe to line | |
self.sweepForme = App.ActiveDocument.addObject('Part::Sweep','Sweep_Externe_') | |
self.sweepForme.Sections=[App.ActiveDocument.getObject(self.Forme.Name), ] | |
self.sweepForme.Spine=(App.ActiveDocument.getObject(self.ligne.Name)) | |
if (self.CB_Solid.isChecked()) or (self.Thickness != 0.0): | |
self.sweepForme.Solid=True | |
else: | |
self.sweepForme.Solid=False | |
self.sweepForme.Frenet=True | |
##### create sweep self.FormeSubtract interne to line | |
if self.Thickness != 0.0: | |
self.sweepFormeS = App.ActiveDocument.addObject('Part::Sweep','Sweep_Substract_') | |
self.sweepFormeS.Sections=[App.ActiveDocument.getObject(self.FormeSubtract.Name), ] | |
self.sweepFormeS.Spine=(App.ActiveDocument.getObject(self.ligne.Name)) | |
self.sweepFormeS.Solid=True | |
##### Contener | |
self.FcSweep = App.ActiveDocument.addObject("App::DocumentObjectGroup","FcSweep") | |
self.FcSweep.addObject(self.sweepForme) | |
self.FcSweep.addObject(self.ligne) | |
self.FcSweep.addObject(self.Forme) | |
##### tube soustraction | |
if self.Thickness != 0.0: | |
### cut object | |
self.cutFcSweep = App.activeDocument().addObject("Part::Cut","Pipe") | |
self.cutFcSweep.Base = self.sweepForme | |
self.cutFcSweep.Tool = self.sweepFormeS | |
self.cutFcSweep.Label = "Pipe" | |
self.FcSweep.addObject(self.sweepFormeS) # Contener | |
self.FcSweep.addObject(self.FormeSubtract)# Contener | |
self.FcSweep.addObject(self.cutFcSweep) # Contener | |
App.ActiveDocument.recompute() | |
##### tube soustraction | |
##### renamme ObjectGroup | |
if self.RB_Line.isChecked(): | |
None | |
else: | |
if self.RB_Polyline.isChecked(): | |
if self.CB_Insc_Circon.isChecked(): | |
self.FcSweep.Label = "Polyline_r_=_" + str(self.Polyline_CirCon) + "_F_=_" + str(self.Polyline_Number_Faces)+ "_I" | |
if (self.Thickness != 0.0): | |
self.FcSweep.Label = "Pipe_Polyline_r_=_" + str(self.Polyline_CirCon) + "_F_=_" + str(self.Polyline_Number_Faces) + "_Th_=_" + str(self.Thickness) + "_I" | |
else: | |
self.FcSweep.Label = "Polyline_r_=_" + str(self.Polyline_CirCon) + "_F_=_" + str(self.Polyline_Number_Faces)+ "_C" | |
if (self.Thickness != 0.0): | |
self.FcSweep.Label = "Pipe_Polyline_r_=_" + str(self.Polyline_CirCon) + "_F_=_" + str(self.Polyline_Number_Faces) + "_Th_=_" + str(self.Thickness) + "_C" | |
elif self.RB_Rectangle.isChecked(): | |
self.FcSweep.Label = "Rectangle_X_=_" + str(self.Rectangle_X) + "_Y_=_" + str(self.Rectangle_Y) | |
if (self.Thickness != 0.0): | |
self.FcSweep.Label = "Pipe_Rectangle_X_=_" + str(self.Rectangle_X) + "_Y_=_" + str(self.Rectangle_Y) + "_Th_=_" + str(self.Thickness) | |
None | |
elif self.RB_Ellipse.isChecked(): | |
self.FcSweep.Label = "Ellipse_X_=_" + str(self.Rectangle_X) + "_Y_=_" + str(self.Rectangle_Y) | |
if (self.Thickness != 0.0): | |
self.FcSweep.Label = "Pipe_Ellipse_X_=_" + str(self.Rectangle_X) + "_Y_=_" + str(self.Rectangle_Y) + "_Th_=_" + str(self.Thickness) | |
None | |
elif self.RB_Circle.isChecked(): | |
self.FcSweep.Label = "Circle_r_=_" + str(self.Circle_Radius) | |
if (self.Thickness != 0.0): | |
self.FcSweep.Label = "Pipe_Circle_r_=_" + str(self.Circle_Radius) + "_Th_=_" + str(self.Thickness) | |
##### renamme sweep | |
self.ligne.Label = "Line_Master_" + self.ligne.Name | |
self.Forme.Label = "Forme_" + self.Forme.Name | |
FreeCADGui.ActiveDocument.getObject(self.ligne.Name).Visibility = False | |
FreeCADGui.ActiveDocument.getObject(self.Forme.Name).Visibility = False | |
if (self.Thickness != 0.0): | |
self.FormeSubtract.Label = "Subtract_" + self.FormeSubtract.Name | |
FreeCADGui.ActiveDocument.getObject(self.FormeSubtract.Name).Visibility = False | |
App.Console.PrintMessage("Thickness : " + str(self.Thickness) + "\n")# Thickness | |
self.label_Info.setText(_fromUtf8("Thickness : " + str(self.Thickness))) | |
App.ActiveDocument.recompute() | |
App.Console.PrintMessage("_______________________" + "\n")# | |
##### section camera origin view restitute | |
FreeCADGui.ActiveDocument.ActiveView.setCameraOrientation(OriginOrientation) | |
if self.RB_Polyline.isChecked(): | |
self.PB_Del_Last_Line.setText(_fromUtf8("Delete last Polyline")) | |
elif self.RB_Rectangle.isChecked(): | |
self.PB_Del_Last_Line.setText(_fromUtf8("Delete last Rectangle")) | |
elif self.RB_Ellipse.isChecked(): | |
self.PB_Del_Last_Line.setText(_fromUtf8("Delete last Ellipse")) | |
elif self.RB_Circle.isChecked(): | |
self.PB_Del_Last_Line.setText(_fromUtf8("Delete last Circle")) | |
elif self.RB_Line.isChecked(): | |
self.PB_Del_Last_Line.setText(_fromUtf8("Delete last Line")) | |
except Exception: | |
App.Console.PrintError(" Error Selection !!" + "\n") | |
self.label_Info.setText(_fromUtf8(" Error Selection !!")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
else: | |
App.Console.PrintError("Select two objects ("+str(len(Gui.Selection.getSelection()))+" object(s) selected)"+"\n") | |
App.Console.PrintError("or straight line, edge and mode 3:SObj. + SObj."+"\n") | |
App.Console.PrintError("_______________________________________________"+"\n") | |
self.label_Info.setText(_fromUtf8("Select one or two objects ("+str(len(Gui.Selection.getSelection()))+" object(s) selected)")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
except Exception: | |
App.Console.PrintError(" Error Selection !!!" + "\n") | |
self.label_Info.setText(_fromUtf8(" Error Selection !!!")) | |
self.label_Info.setStyleSheet("QLabel {color : #ffffff; background-color : #FF3300;}") | |
##################################### | |
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macros/FCMmacros/" + __title__).SetString("Version",__version__ + " (" + __date__ + ")")# | |
MainWindow = QtWidgets.QMainWindow() | |
MainWindow.setObjectName("__title__") # macro internal Name | |
ui = Ui_MainWindow() | |
ui.setupUi(MainWindow) | |
MainWindow.show() | |
Hey, nice tool, but in Version 0.18 beta it thorws this error: "Select twoo objects (1 object(s) selected)."
I selected two objects like it works in version 0.17 it works.
Hi
this version correct the default: getselection() ... changed in new version FC 0.18 and more
see https://forum.freecadweb.org/viewtopic.php?p=299467#p315541
and upgrade now you can select 2 points or only the line, wire, edge
mario
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This macro utility is intended for the use of the program FreeCAD http://www.freecadweb.org/
The icon for your toolbar, it is to place in your macros directory (in the same location of the macro)