Salome HOME
Specification controls
authornds <natalia.donis@opencascade.com>
Thu, 4 Jun 2015 13:30:15 +0000 (16:30 +0300)
committernds <natalia.donis@opencascade.com>
Thu, 4 Jun 2015 13:30:15 +0000 (16:30 +0300)
16 files changed:
src/FeaturesPlugin/CMakeLists.txt
src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.cpp [new file with mode: 0755]
src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.h [new file with mode: 0755]
src/FeaturesPlugin/FeaturesPlugin_Placement.cpp
src/FeaturesPlugin/FeaturesPlugin_Placement.h
src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp
src/FeaturesPlugin/FeaturesPlugin_Rotation.cpp [new file with mode: 0755]
src/FeaturesPlugin/FeaturesPlugin_Rotation.h [new file with mode: 0755]
src/FeaturesPlugin/extrusioncut_widget.xml [new file with mode: 0755]
src/FeaturesPlugin/placement_widget.xml
src/FeaturesPlugin/plugin-Features.xml
src/FeaturesPlugin/rotation_widget.xml [new file with mode: 0755]
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/PartSet/PartSet_icons.qrc
src/PartSet/icons/placement_from.png [new file with mode: 0755]
src/PartSet/icons/placement_to.png [new file with mode: 0755]

index 6bd7dcd403cf35baf3c01587efe2831f1a07ddc0..4aa8619f0dbc2cd105de6d4fac68e47b68df89f1 100644 (file)
@@ -7,7 +7,9 @@ SET(PROJECT_HEADERS
     FeaturesPlugin.h
     FeaturesPlugin_Plugin.h
     FeaturesPlugin_Extrusion.h
+    FeaturesPlugin_ExtrusionCut.h
     FeaturesPlugin_Revolution.h
+    FeaturesPlugin_Rotation.h
     FeaturesPlugin_Boolean.h
     FeaturesPlugin_Group.h
     FeaturesPlugin_Placement.h
@@ -16,7 +18,9 @@ SET(PROJECT_HEADERS
 SET(PROJECT_SOURCES
     FeaturesPlugin_Plugin.cpp
     FeaturesPlugin_Extrusion.cpp
+    FeaturesPlugin_ExtrusionCut.cpp
     FeaturesPlugin_Revolution.cpp
+    FeaturesPlugin_Rotation.cpp
     FeaturesPlugin_Boolean.cpp
     FeaturesPlugin_Group.cpp
     FeaturesPlugin_Placement.cpp
@@ -25,7 +29,9 @@ SET(PROJECT_SOURCES
 SET(XML_RESOURCES
   plugin-Features.xml
   extrusion_widget.xml
+  extrusioncut_widget.xml
   revolution_widget.xml
+  rotation_widget.xml
   boolean_widget.xml
   group_widget.xml
   placement_widget.xml
diff --git a/src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.cpp b/src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.cpp
new file mode 100755 (executable)
index 0000000..cfd5b5d
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        FeaturesPlugin_ExtrusionCut.cpp
+// Created:     12 May 2015
+// Author:      Dmitry Bobylev
+
+#include <FeaturesPlugin_ExtrusionCut.h>
+
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeReference.h>
+#include <ModelAPI_Validator.h>
+#include <ModelAPI_Session.h>
+
+//=================================================================================================
+FeaturesPlugin_ExtrusionCut::FeaturesPlugin_ExtrusionCut()
+{
+}
+
+//=================================================================================================
+void FeaturesPlugin_ExtrusionCut::initAttributes()
+{
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::SKETCH_OBJECT_ID(), ModelAPI_AttributeReference::typeId());
+
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::TO_SIZE_ID(), ModelAPI_AttributeDouble::typeId());
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::FROM_SIZE_ID(), ModelAPI_AttributeDouble::typeId());
+
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::AXIS_OBJECT_ID(), ModelAPI_AttributeReference::typeId());
+
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
+  data()->addAttribute(FeaturesPlugin_ExtrusionCut::TO_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
+
+  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_ExtrusionCut::FROM_OBJECT_ID());
+  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_ExtrusionCut::TO_OBJECT_ID());
+
+  AttributeSelectionListPtr aSelection = 
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
+    FeaturesPlugin_ExtrusionCut::LIST_ID(), ModelAPI_AttributeSelectionList::typeId()));
+  // extrusion works with faces always
+  aSelection->setSelectionType("SOLID");
+}
+
+//=================================================================================================
+void FeaturesPlugin_ExtrusionCut::execute()
+{
+}
diff --git a/src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.h b/src/FeaturesPlugin/FeaturesPlugin_ExtrusionCut.h
new file mode 100755 (executable)
index 0000000..8285682
--- /dev/null
@@ -0,0 +1,94 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        FeaturesPlugin_ExtrusionCut.h
+// Created:     12 May 2015
+// Author:      Dmitry Bobylev
+
+#ifndef FeaturesPlugin_ExtrusionCut_H_
+#define FeaturesPlugin_ExtrusionCut_H_
+
+#include <FeaturesPlugin.h>
+
+#include <ModelAPI_Feature.h>
+
+/** \class FeaturesPlugin_ExtrusionCut
+ *  \ingroup Plugins
+ */
+class FeaturesPlugin_ExtrusionCut : public ModelAPI_Feature
+{
+ public:
+  /// Revolution kind.
+  inline static const std::string& ID()
+  {
+    static const std::string MY_REVOLUTION_ID("ExtrusionCut");
+    return MY_REVOLUTION_ID;
+  }
+
+  /// attribute name of references sketch entities list, it should contain a sketch result or
+  /// a pair a sketch result to sketch face
+  inline static const std::string& LIST_ID()
+  {
+    static const std::string MY_GROUP_LIST_ID("main_objects");
+    return MY_GROUP_LIST_ID;
+  }
+
+  /// attribute name of an object to which the extrusion grows
+  inline static const std::string& SKETCH_OBJECT_ID()
+  {
+    static const std::string MY_TO_OBJECT_ID("sketch");
+    return MY_TO_OBJECT_ID;
+  }
+
+  /// Attribute name of an object to which the extrusion grows.
+  inline static const std::string& AXIS_OBJECT_ID()
+  {
+    static const std::string MY_TO_OBJECT_ID("axis_object");
+    return MY_TO_OBJECT_ID;
+  }
+
+  /// attribute name of extrusion size
+  inline static const std::string& TO_SIZE_ID()
+  {
+    static const std::string MY_TO_SIZE_ID("to_size");
+    return MY_TO_SIZE_ID;
+  }
+
+  /// attribute name of extrusion size
+  inline static const std::string& FROM_SIZE_ID()
+  {
+    static const std::string MY_FROM_SIZE_ID("from_size");
+    return MY_FROM_SIZE_ID;
+  }
+
+  /// attribute name of an object to which the extrusion grows
+  inline static const std::string& TO_OBJECT_ID()
+  {
+    static const std::string MY_TO_OBJECT_ID("to_object");
+    return MY_TO_OBJECT_ID;
+  }
+
+  /// attribute name of tool object
+  inline static const std::string& FROM_OBJECT_ID()
+  {
+    static const std::string MY_FROM_OBJECT_ID("from_object");
+    return MY_FROM_OBJECT_ID;
+  }
+
+  /// Returns the kind of a feature
+  FEATURESPLUGIN_EXPORT virtual const std::string& getKind()
+  {
+    static std::string MY_KIND = FeaturesPlugin_ExtrusionCut::ID();
+    return MY_KIND;
+  }
+
+  /// Creates a new part document if needed.
+  FEATURESPLUGIN_EXPORT virtual void execute();
+
+  /// Request for initialization of data model of the feature: adding all attributes.
+  FEATURESPLUGIN_EXPORT virtual void initAttributes();
+
+  /// Use plugin manager for features creation.
+  FeaturesPlugin_ExtrusionCut();
+};
+
+#endif
index 3ba02779f5b5a7cdb10b849ae6676bb742986070..d069858d45e3c528412516c8e6b3c73911cc7f88 100644 (file)
@@ -10,6 +10,7 @@
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_AttributeSelection.h>
 #include <ModelAPI_AttributeBoolean.h>
+#include <ModelAPI_AttributeSelectionList.h>
 
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Face.h>
@@ -26,6 +27,13 @@ FeaturesPlugin_Placement::FeaturesPlugin_Placement()
 
 void FeaturesPlugin_Placement::initAttributes()
 {
+  /* Modification for specification of 1.3.0
+  AttributeSelectionListPtr aSelection = 
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
+    FeaturesPlugin_Placement::LIST_ID(), ModelAPI_AttributeSelectionList::typeId()));
+  // extrusion works with faces always
+  aSelection->setSelectionType("SOLID");
+  */
   data()->addAttribute(FeaturesPlugin_Placement::BASE_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
   data()->addAttribute(FeaturesPlugin_Placement::ATTRACT_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
   data()->addAttribute(FeaturesPlugin_Placement::REVERSE_ID(), ModelAPI_AttributeBoolean::typeId());
index 8039f37e2c84db33e0dd46c78f0dcf7e2f043a3f..b83d07e9593f40e72586cca0a23d2f3c5ef5320b 100644 (file)
@@ -31,6 +31,14 @@ class FeaturesPlugin_Placement : public ModelAPI_Feature
     static const std::string MY_PLACEMENT_ID("Placement");
     return MY_PLACEMENT_ID;
   }
+  /// attribute name of references sketch entities list, it should contain a sketch result or
+  /// a pair a sketch result to sketch face
+  /*Modification for specification of 1.3.0
+  inline static const std::string& LIST_ID()
+  {
+    static const std::string MY_GROUP_LIST_ID("base");
+    return MY_GROUP_LIST_ID;
+  }*/
   /// attribute name of referenced object
   inline static const std::string& BASE_OBJECT_ID()
   {
index c35243e8d9d2c25a68808428ac32d808b28764d4..100dddf3e297f2b0c2fb4e8763de45cff852e8c6 100644 (file)
@@ -4,9 +4,11 @@
 
 #include <FeaturesPlugin_Boolean.h>
 #include <FeaturesPlugin_Extrusion.h>
+#include <FeaturesPlugin_ExtrusionCut.h>
 #include <FeaturesPlugin_Group.h>
 #include <FeaturesPlugin_Placement.h>
 #include <FeaturesPlugin_Revolution.h>
+#include <FeaturesPlugin_Rotation.h>
 
 #include <ModelAPI_Session.h>
 
@@ -30,13 +32,17 @@ FeaturePtr FeaturesPlugin_Plugin::createFeature(string theFeatureID)
   if (theFeatureID == FeaturesPlugin_Extrusion::ID()) {
     return FeaturePtr(new FeaturesPlugin_Extrusion);
   } else if (theFeatureID == FeaturesPlugin_Revolution::ID()) {
-    return FeaturePtr(new FeaturesPlugin_Revolution);
+   return FeaturePtr(new FeaturesPlugin_Revolution);
+  } else if (theFeatureID == FeaturesPlugin_Rotation::ID()) {
+    return FeaturePtr(new FeaturesPlugin_Rotation);
   } else if (theFeatureID == FeaturesPlugin_Boolean::ID()) {
     return FeaturePtr(new FeaturesPlugin_Boolean);
   } else if (theFeatureID == FeaturesPlugin_Group::ID()) {
     return FeaturePtr(new FeaturesPlugin_Group);
   } else if (theFeatureID == FeaturesPlugin_Placement::ID()) {
     return FeaturePtr(new FeaturesPlugin_Placement);
+  } else if (theFeatureID == FeaturesPlugin_ExtrusionCut::ID()) {
+    return FeaturePtr(new FeaturesPlugin_ExtrusionCut);
   }
   // feature of such kind is not found
   return FeaturePtr();
diff --git a/src/FeaturesPlugin/FeaturesPlugin_Rotation.cpp b/src/FeaturesPlugin/FeaturesPlugin_Rotation.cpp
new file mode 100755 (executable)
index 0000000..8493688
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        FeaturesPlugin_Rotation.cpp
+// Created:     12 May 2015
+// Author:      Dmitry Bobylev
+
+#include <FeaturesPlugin_Rotation.h>
+
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_Session.h>
+
+//=================================================================================================
+FeaturesPlugin_Rotation::FeaturesPlugin_Rotation()
+{
+}
+
+//=================================================================================================
+void FeaturesPlugin_Rotation::initAttributes()
+{
+  AttributeSelectionListPtr aSelection = 
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(data()->addAttribute(
+    FeaturesPlugin_Rotation::LIST_ID(), ModelAPI_AttributeSelectionList::typeId()));
+  // revolution works with faces always
+  aSelection->setSelectionType("SOLID");
+
+  data()->addAttribute(FeaturesPlugin_Rotation::AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId());
+
+  data()->addAttribute(FeaturesPlugin_Rotation::ANGLE_ID(), ModelAPI_AttributeDouble::typeId());
+}
+
+//=================================================================================================
+void FeaturesPlugin_Rotation::execute()
+{
+}
diff --git a/src/FeaturesPlugin/FeaturesPlugin_Rotation.h b/src/FeaturesPlugin/FeaturesPlugin_Rotation.h
new file mode 100755 (executable)
index 0000000..b8a65d6
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        FeaturesPlugin_Rotation.h
+// Created:     12 May 2015
+// Author:      Dmitry Bobylev
+
+#ifndef FeaturesPlugin_Rotation_H_
+#define FeaturesPlugin_Rotation_H_
+
+#include <FeaturesPlugin.h>
+
+#include <ModelAPI_Feature.h>
+
+/** \class FeaturesPlugin_Rotation
+ *  \ingroup Plugins
+ *  \brief Feature for creation of revolution from the planar face.
+ *  Revolution creates the lateral faces based on edges of the base face and
+ *  the start and end faces and/or start and end angles.
+ */
+class FeaturesPlugin_Rotation : public ModelAPI_Feature
+{
+ public:
+  /// Revolution kind.
+  inline static const std::string& ID()
+  {
+    static const std::string MY_REVOLUTION_ID("Rotation");
+    return MY_REVOLUTION_ID;
+  }
+
+  /// Attribute name of references sketch entities list, it should contain a sketch result or
+  /// a pair a sketch result to sketch face.
+  inline static const std::string& LIST_ID()
+  {
+    static const std::string MY_GROUP_LIST_ID("base");
+    return MY_GROUP_LIST_ID;
+  }
+
+  /// Attribute name of an object to which the extrusion grows.
+  inline static const std::string& AXIS_OBJECT_ID()
+  {
+    static const std::string MY_TO_OBJECT_ID("axis_object");
+    return MY_TO_OBJECT_ID;
+  }
+
+  /// Attribute name of revolution angle.
+  inline static const std::string& ANGLE_ID()
+  {
+    static const std::string MY_TO_ANGLE_ID("angle");
+    return MY_TO_ANGLE_ID;
+  }
+
+  /// \return the kind of a feature.
+  FEATURESPLUGIN_EXPORT virtual const std::string& getKind()
+  {
+    static std::string MY_KIND = FeaturesPlugin_Rotation::ID();
+    return MY_KIND;
+  }
+
+  /// Creates a new part document if needed.
+  FEATURESPLUGIN_EXPORT virtual void execute();
+
+  /// Request for initialization of data model of the feature: adding all attributes.
+  FEATURESPLUGIN_EXPORT virtual void initAttributes();
+
+  /// Use plugin manager for features creation.
+  FeaturesPlugin_Rotation();
+};
+
+#endif
diff --git a/src/FeaturesPlugin/extrusioncut_widget.xml b/src/FeaturesPlugin/extrusioncut_widget.xml
new file mode 100755 (executable)
index 0000000..7e510b1
--- /dev/null
@@ -0,0 +1,65 @@
+<!-- Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+<source>
+  <groupbox title="Revolution">
+    <shape_selector id="main_objects"
+    label="Select an object"
+    icon=":icons/sketch.png"
+    tooltip="Select a destination element"
+    shape_types="face edge vertex"
+    default="&lt;sketch&gt;"
+  />
+  <shape_selector id="axis_object"
+                    icon=":icons/axis.png"
+                    label="Axis"
+                    tooltip="Select an edge for axis"
+                    shape_types="edge"
+                    default="">
+    <validator id="GeomValidators_ShapeType" parameters="line"/>
+    </shape_selector>
+    <groupbox title="From">
+    <shape_selector id="from_object"
+                    icon=":icons/plane.png"
+                    label="Plane face"
+                    tooltip="Select a planar face"
+                    shape_types="face"
+                    default="&lt;sketch&gt;">
+      <validator id="GeomValidators_Face" parameters="plane"/>
+    </shape_selector>
+    <doublevalue
+      id="from_size"
+      label="Angle"
+      min="0"
+      step="1.0"
+      default="0"
+      icon=":icons/angle_down.png"
+      tooltip="Height">
+    </doublevalue>
+  </groupbox>
+  <groupbox title="To">
+    <shape_selector id="to_object"
+                    icon=":icons/plane_inverted.png"
+                    label="Plane face"
+                    tooltip="Select a planar face"
+                    shape_types="face"
+                    default="&lt;sketch&gt;">
+      <validator id="GeomValidators_Face" parameters="plane"/>
+    </shape_selector>
+    <doublevalue
+      id="to_size"
+      label="Angle"
+      min="0"
+      step="1.0"
+      default="0"
+      icon=":icons/angle_down.png"
+      tooltip="Height">
+    </doublevalue>
+  </groupbox>
+  </groupbox>
+  <multi_selector id="main_objects"
+    label="Cut from:"
+    icon=":icons/cut_shape.png"
+    tooltip="Select a sketch face"
+    type_choice="Solids">
+  </multi_selector>
+</source>
index 109d0d62cf7f4fa3f97fefe89734e455fa5a12c1..2e6b8f2375504eebcc59ac3eeea13eeb9d71e2d4 100644 (file)
@@ -1,15 +1,26 @@
 <!-- Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
 
 <source>
+  <!--Modification for specification of 1.3.0
+  <multi_selector id="base"
+    label="Select a sketch face"
+    icon=":icons/cut_shape.png"
+    tooltip="Select a sketch face"
+    type_choice="Solids">
+  </multi_selector>-->
+  <!--Modification for specification of 1.3.0
+    icon=":icons/placement_from.png"-->
   <shape_selector id="placement_base_object" 
     label="Select an object" 
     icon=":icons/cut_shape.png" 
     tooltip="Select a destination element"
     shape_types="face edge vertex"
   />
+  <!--Modification for specification of 1.3.0
+      icon=":icons/placement_to.png"-->
   <shape_selector id="placement_attractable_object" 
     label="Select an object" 
-    icon=":icons/cut_shape.png" 
+    icon=":icons/cut_shape.png"
     tooltip="Select an element of moved object" 
     shape_types="face edge vertex" 
     concealment="true" >
index 288ae115b13ca606470c8ad0254a43099eeaa167..c6f0a65f361b869a231a6748d3b748757a9266a5 100644 (file)
       <feature id="Placement" title="Placement" tooltip="Perform moving of an object to specified position" icon=":icons/placement.png">
           <source path="placement_widget.xml"/>
       </feature>
+      <!--Modification for specification of 1.3.0
+      <feature id="Rotation" title="Movement" tooltip="" icon=":icons/placement.png">
+        <source path="rotation_widget.xml"/>
+      </feature>
+      <feature id="ExtrusionCut" title="RevolutionCut" tooltip="" icon=":icons/placement.png">
+        <source path="extrusioncut_widget.xml"/>
+      </feature>-->
     </group>
     <group id="Collections">
       <feature id="Group"
diff --git a/src/FeaturesPlugin/rotation_widget.xml b/src/FeaturesPlugin/rotation_widget.xml
new file mode 100755 (executable)
index 0000000..2b38c9a
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+<source>
+  <multi_selector id="base"
+    label="Select a sketch face"
+    icon=":icons/cut_shape.png"
+    tooltip="Select a sketch face"
+    type_choice="Solids">
+  </multi_selector>
+  <shape_selector id="axis_object"
+                  icon=":icons/axis.png"
+                  label="Axis"
+                  tooltip="Select an edge for axis"
+                  shape_types="edge"
+                  default="">
+  </shape_selector>
+  <doublevalue
+    id="angle"
+    label="Angle"
+    min="0"
+    step="1.0"
+    default="0"
+    icon=":icons/radius.png"
+    tooltip="Angle">
+  </doublevalue>
+</source>
\ No newline at end of file
index d20ddf8e82ca0a40aed7871c210a527189bd8e0a..755d74c59217940d963bcbfe16987332b829acb5 100644 (file)
@@ -68,7 +68,10 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
     myTypeCombo->setVisible(false);
   }
 
-  QLabel* aListLabel = new QLabel(tr("Selected objects:"), this);
+// Modification for specification of 1.3.0
+  std::string aLabelText = "";//theData->getProperty("label");
+  QLabel* aListLabel = new QLabel(!aLabelText.empty() ? aLabelText.c_str()
+                                                      : tr("Selected objects:"), this);
   aMainLay->addWidget(aListLabel, 1, 0);
   // if the xml definition contains one type, an information label should be shown near to the latest
   if (aShapeTypes.size() == 1) {
index efc034cb5ee420db422506a8e656f3bf722389fb..1f679d3247efb759dd69ce8b019b0723f362fb8a 100644 (file)
@@ -36,6 +36,8 @@
      <file>icons/shape_group.png</file>
      <file>icons/fixed.png</file>
      <file>icons/placement.png</file>
+     <file>icons/placement_from.png</file>
+     <file>icons/placement_to.png</file>
      <file>icons/geom_export.png</file>
      <file>icons/horisontal.png</file>
      <file>icons/vertical.png</file>
diff --git a/src/PartSet/icons/placement_from.png b/src/PartSet/icons/placement_from.png
new file mode 100755 (executable)
index 0000000..3dee133
Binary files /dev/null and b/src/PartSet/icons/placement_from.png differ
diff --git a/src/PartSet/icons/placement_to.png b/src/PartSet/icons/placement_to.png
new file mode 100755 (executable)
index 0000000..219138f
Binary files /dev/null and b/src/PartSet/icons/placement_to.png differ