Regenrated the branch (rebase failed)
This commit is contained in:
parent
94187a6872
commit
fc7c75ba84
|
@ -3,6 +3,8 @@ SET(ShipMain_SRCS
|
|||
ShipGui.py
|
||||
Instance.py
|
||||
Ship_rc.py
|
||||
TankInstance.py
|
||||
WeightInstance.py
|
||||
)
|
||||
SOURCE_GROUP("" FILES ${ShipMain_SRCS})
|
||||
|
||||
|
@ -55,21 +57,44 @@ SET(ShipHydrostatics_SRCS
|
|||
)
|
||||
SOURCE_GROUP("shiphydrostatics" FILES ${ShipHydrostatics_SRCS})
|
||||
|
||||
SET(ShipCreateWeight_SRCS
|
||||
shipCreateWeight/__init__.py
|
||||
shipCreateWeight/TaskPanel.py
|
||||
shipCreateWeight/TaskPanel.ui
|
||||
)
|
||||
SOURCE_GROUP("shipcreateweight" FILES ${ShipCreateWeight_SRCS})
|
||||
|
||||
SET(ShipCreateTank_SRCS
|
||||
shipCreateTank/__init__.py
|
||||
shipCreateTank/TaskPanel.py
|
||||
shipCreateTank/TaskPanel.ui
|
||||
)
|
||||
SOURCE_GROUP("shipcreatetank" FILES ${ShipCreateTank_SRCS})
|
||||
|
||||
SET(ShipCapacityCurve_SRCS
|
||||
shipCapacityCurve/__init__.py
|
||||
shipCapacityCurve/PlotAux.py
|
||||
shipCapacityCurve/TaskPanel.py
|
||||
shipCapacityCurve/TaskPanel.ui
|
||||
)
|
||||
SOURCE_GROUP("shipcapacitycurve" FILES ${ShipCapacityCurve_SRCS})
|
||||
|
||||
SET(ShipUtils_SRCS
|
||||
shipUtils/__init__.py
|
||||
shipUtils/Locale.py
|
||||
shipUtils/Math.py
|
||||
shipUtils/Paths.py
|
||||
shipUtils/Units.py
|
||||
)
|
||||
SOURCE_GROUP("shiputils" FILES ${ShipUtils_SRCS})
|
||||
|
||||
SET(all_files ${ShipMain_SRCS} ${ShipExamples_SRCS} ${ShipLoadExample_SRCS} ${ShipCreateShip_SRCS} ${ShipOutlineDraw_SRCS} ${ShipAreasCurve_SRCS} ${ShipHydrostatics_SRCS} ${ShipUtils_SRCS})
|
||||
SET(all_files ${ShipMain_SRCS} ${ShipExamples_SRCS} ${ShipLoadExample_SRCS} ${ShipCreateShip_SRCS} ${ShipOutlineDraw_SRCS} ${ShipAreasCurve_SRCS} ${ShipHydrostatics_SRCS} ${ShipCreateWeight_SRCS} ${ShipCreateTank_SRCS} ${ShipCapacityCurve_SRCS} ${ShipUtils_SRCS})
|
||||
|
||||
ADD_CUSTOM_TARGET(Ship ALL
|
||||
SOURCES ${all_files}
|
||||
)
|
||||
|
||||
fc_copy_sources(Ship "${CMAKE_BINARY_DIR}/Mod/Ship" ${all_files})
|
||||
fc_copy_sources(Mod/Ship "${CMAKE_BINARY_DIR}/Mod/Ship" ${all_files})
|
||||
|
||||
INSTALL(
|
||||
FILES
|
||||
|
@ -107,6 +132,24 @@ INSTALL(
|
|||
DESTINATION
|
||||
Mod/Ship/shipHydrostatics
|
||||
)
|
||||
INSTALL(
|
||||
FILES
|
||||
${ShipCreateWeight_SRCS}
|
||||
DESTINATION
|
||||
Mod/Ship/shipCreateWeight
|
||||
)
|
||||
INSTALL(
|
||||
FILES
|
||||
${ShipCreateTank_SRCS}
|
||||
DESTINATION
|
||||
Mod/Ship/shipCreateTank
|
||||
)
|
||||
INSTALL(
|
||||
FILES
|
||||
${ShipCapacityCurve_SRCS}
|
||||
DESTINATION
|
||||
Mod/Ship/shipCapacityCurve
|
||||
)
|
||||
INSTALL(
|
||||
FILES
|
||||
${ShipUtils_SRCS}
|
||||
|
|
|
@ -50,12 +50,14 @@ class ShipWorkbench(Workbench):
|
|||
"Ship_OutlineDraw",
|
||||
"Ship_AreasCurve",
|
||||
"Ship_Hydrostatics"]
|
||||
weightslist = ["Ship_Weight",
|
||||
"Ship_Tank",
|
||||
"Ship_Capacity"]
|
||||
"""
|
||||
weightslist = ["Ship_Weights",
|
||||
"Ship_CreateTank",
|
||||
"Ship_GZ"]
|
||||
"""
|
||||
weightslist = []
|
||||
self.appendToolbar(
|
||||
str(QtCore.QT_TRANSLATE_NOOP("Ship", "Ship design")),
|
||||
shiplist)
|
||||
|
|
|
@ -91,6 +91,25 @@ class Ship:
|
|||
"ExternalFaces",
|
||||
"Ship",
|
||||
tooltip)
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Set of weight instances",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyStringList",
|
||||
"Weights",
|
||||
"Ship",
|
||||
tooltip).Weights = []
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Set of tank instances",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyStringList",
|
||||
"Tanks",
|
||||
"Ship",
|
||||
tooltip).Tanks = []
|
||||
|
||||
obj.Proxy = self
|
||||
|
||||
def onChanged(self, fp, prop):
|
||||
|
@ -185,80 +204,46 @@ class ViewProviderShip:
|
|||
"""
|
||||
return None
|
||||
|
||||
def claimChildren(self):
|
||||
objs = []
|
||||
# Locate the owner ship object
|
||||
doc_objs = FreeCAD.ActiveDocument.Objects
|
||||
obj = None
|
||||
for doc_obj in doc_objs:
|
||||
try:
|
||||
v_provider = doc_obj.ViewObject.Proxy
|
||||
if v_provider == self:
|
||||
obj = doc_obj
|
||||
except:
|
||||
continue
|
||||
if obj is None:
|
||||
FreeCAD.Console.PrintError("Orphan view provider found...\n")
|
||||
FreeCAD.Console.PrintError(self)
|
||||
FreeCAD.Console.PrintError('\n')
|
||||
return objs
|
||||
|
||||
# Claim the weights
|
||||
bad_linked = 0
|
||||
for i, w in enumerate(obj.Weights):
|
||||
try:
|
||||
w_obj = FreeCAD.ActiveDocument.getObject(w)
|
||||
objs.append(w_obj)
|
||||
except:
|
||||
del obj.Weights[i - bad_linked]
|
||||
bad_linked += 1
|
||||
|
||||
# Claim the tanks
|
||||
bad_linked = 0
|
||||
for i, t in enumerate(obj.Tanks):
|
||||
try:
|
||||
t_obj = FreeCAD.ActiveDocument.getObject(t)
|
||||
objs.append(t_obj)
|
||||
except:
|
||||
del obj.Tanks[i - bad_linked]
|
||||
bad_linked += 1
|
||||
|
||||
return objs
|
||||
|
||||
def getIcon(self):
|
||||
"""Returns the icon for this kind of objects."""
|
||||
return ":/icons/Ship_Instance.svg"
|
||||
|
||||
|
||||
def weights(obj):
|
||||
"""Returns the ship weights list. If weights has not been set this tool
|
||||
will generate the default ones.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Ship inmstance object.
|
||||
"""
|
||||
# Test if is a ship instance
|
||||
props = obj.PropertiesList
|
||||
try:
|
||||
props.index("IsShip")
|
||||
except ValueError:
|
||||
return None
|
||||
if not obj.IsShip:
|
||||
return None
|
||||
# Test if properties already exist
|
||||
try:
|
||||
props.index("WeightNames")
|
||||
except ValueError:
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Ship Weights names",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
lighweight = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Lightweight",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyStringList",
|
||||
"WeightNames",
|
||||
"Ship",
|
||||
tooltip).WeightNames = [lighweight]
|
||||
try:
|
||||
props.index("WeightMass")
|
||||
except ValueError:
|
||||
# Compute a mass aproximation
|
||||
from shipHydrostatics import Tools
|
||||
disp = Tools.displacement(obj, obj.Draft)
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Ship Weights masses [tons]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloatList",
|
||||
"WeightMass",
|
||||
"Ship",
|
||||
tooltip).WeightMass = [1000.0 * disp[0]]
|
||||
try:
|
||||
props.index("WeightPos")
|
||||
except ValueError:
|
||||
# Compute a CoG aproximation
|
||||
from shipHydrostatics import Tools
|
||||
disp = Tools.displacement(obj, obj.Draft)
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"Ship",
|
||||
"Ship Weights centers of gravity",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyVectorList",
|
||||
"WeightPos",
|
||||
"Ship",
|
||||
tooltip).WeightPos = [Vector(disp[1].x,
|
||||
0.0,
|
||||
obj.Draft)]
|
||||
# Setup the weights list
|
||||
weights = []
|
||||
for i in range(len(obj.WeightNames)):
|
||||
weights.append([obj.WeightNames[i],
|
||||
obj.WeightMass[i],
|
||||
obj.WeightPos[i]])
|
||||
return weights
|
||||
|
|
62
src/Mod/Ship/Makefile.am
Normal file
62
src/Mod/Ship/Makefile.am
Normal file
|
@ -0,0 +1,62 @@
|
|||
# Change data dir from default ($(prefix)/share) to actual dir
|
||||
datadir = $(prefix)/Mod/Ship
|
||||
|
||||
data_DATA = \
|
||||
InitGui.py \
|
||||
ShipGui.py \
|
||||
Instance.py \
|
||||
Ship_rc.py \
|
||||
TankInstance.py \
|
||||
WeightInstance.py
|
||||
|
||||
nobase_data_DATA = \
|
||||
resources/examples/s60.fcstd \
|
||||
resources/examples/s60_katamaran.fcstd \
|
||||
resources/examples/wigley.fcstd \
|
||||
resources/examples/wigley_katamaran.fcstd \
|
||||
shipLoadExample/__init__.py \
|
||||
shipLoadExample/TaskPanel.py \
|
||||
shipLoadExample/TaskPanel.ui \
|
||||
shipCreateShip/__init__.py \
|
||||
shipCreateShip/Preview.py \
|
||||
shipCreateShip/TaskPanel.py \
|
||||
shipCreateShip/TaskPanel.ui \
|
||||
shipOutlineDraw/__init__.py \
|
||||
shipOutlineDraw/Preview.py \
|
||||
shipOutlineDraw/TaskPanel.py \
|
||||
shipOutlineDraw/TaskPanel.ui \
|
||||
shipAreasCurve/__init__.py \
|
||||
shipAreasCurve/PlotAux.py \
|
||||
shipAreasCurve/Preview.py \
|
||||
shipAreasCurve/TaskPanel.py \
|
||||
shipAreasCurve/TaskPanel.ui \
|
||||
shipHydrostatics/__init__.py \
|
||||
shipHydrostatics/PlotAux.py \
|
||||
shipHydrostatics/TaskPanel.py \
|
||||
shipHydrostatics/TaskPanel.ui \
|
||||
shipHydrostatics/Tools.py \
|
||||
shipCreateWeight/__init__.py \
|
||||
shipCreateWeight/TaskPanel.py \
|
||||
shipCreateWeight/TaskPanel.ui \
|
||||
shipCreateTank/__init__.py \
|
||||
shipCreateTank/TaskPanel.py \
|
||||
shipCreateTank/TaskPanel.ui \
|
||||
shipCapacityCurve/__init__.py \
|
||||
shipCapacityCurve/PlotAux.py \
|
||||
shipCapacityCurve/TaskPanel.py \
|
||||
shipCapacityCurve/TaskPanel.ui \
|
||||
shipUtils/__init__.py \
|
||||
shipUtils/Locale.py \
|
||||
shipUtils/Math.py \
|
||||
shipUtils/Paths.py \
|
||||
shipUtils/Units.py
|
||||
|
||||
CLEANFILES = $(BUILT_SOURCES)
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(data_DATA) \
|
||||
$(nobase_data_DATA) \
|
||||
CMakeLists.txt \
|
||||
README \
|
||||
ship.dox
|
||||
|
|
@ -119,8 +119,62 @@ class Hydrostatics:
|
|||
'ToolTip': ToolTip}
|
||||
|
||||
|
||||
class CreateWeight:
|
||||
def Activated(self):
|
||||
import shipCreateWeight
|
||||
shipCreateWeight.load()
|
||||
|
||||
def GetResources(self):
|
||||
MenuText = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_weight',
|
||||
'Create a new ship weight')
|
||||
ToolTip = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_weight',
|
||||
'Create a new ship weight')
|
||||
return {'Pixmap': 'Ship_Weight',
|
||||
'MenuText': MenuText,
|
||||
'ToolTip': ToolTip}
|
||||
|
||||
|
||||
class CreateTank:
|
||||
def Activated(self):
|
||||
import shipCreateTank
|
||||
shipCreateTank.load()
|
||||
|
||||
def GetResources(self):
|
||||
MenuText = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_tank',
|
||||
'Create a new tank')
|
||||
ToolTip = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_tank',
|
||||
'Create a new tank')
|
||||
return {'Pixmap': 'Ship_Tank',
|
||||
'MenuText': MenuText,
|
||||
'ToolTip': ToolTip}
|
||||
|
||||
|
||||
class TankCapacity:
|
||||
def Activated(self):
|
||||
import shipCapacityCurve
|
||||
shipCapacityCurve.load()
|
||||
|
||||
def GetResources(self):
|
||||
MenuText = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_capacity',
|
||||
'Tank capacity curve')
|
||||
ToolTip = QtCore.QT_TRANSLATE_NOOP(
|
||||
'ship_capacity',
|
||||
'Plot the tank capacity curve (level-volume curve)')
|
||||
return {'Pixmap': 'Ship_CapacityCurve',
|
||||
'MenuText': MenuText,
|
||||
'ToolTip': ToolTip}
|
||||
|
||||
|
||||
FreeCADGui.addCommand('Ship_LoadExample', LoadExample())
|
||||
FreeCADGui.addCommand('Ship_CreateShip', CreateShip())
|
||||
FreeCADGui.addCommand('Ship_OutlineDraw', OutlineDraw())
|
||||
FreeCADGui.addCommand('Ship_AreasCurve', AreasCurve())
|
||||
FreeCADGui.addCommand('Ship_Hydrostatics', Hydrostatics())
|
||||
FreeCADGui.addCommand('Ship_Weight', CreateWeight())
|
||||
FreeCADGui.addCommand('Ship_Tank', CreateTank())
|
||||
FreeCADGui.addCommand('Ship_Capacity', TankCapacity())
|
||||
|
|
File diff suppressed because one or more lines are too long
225
src/Mod/Ship/TankInstance.py
Normal file
225
src/Mod/Ship/TankInstance.py
Normal file
|
@ -0,0 +1,225 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import time
|
||||
from math import *
|
||||
from PySide import QtGui, QtCore
|
||||
from pivy.coin import *
|
||||
from pivy import coin
|
||||
import FreeCAD
|
||||
import FreeCADGui
|
||||
from FreeCAD import Base, Vector
|
||||
import Part
|
||||
import Units
|
||||
from shipUtils import Paths, Math
|
||||
|
||||
|
||||
class Tank:
|
||||
def __init__(self, obj, shapes, ship):
|
||||
""" Transform a generic object to a ship instance.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Part::FeaturePython created object which should be transformed
|
||||
in a weight instance.
|
||||
shapes -- Set of solid shapes which will compound the tank.
|
||||
ship -- Ship where the tank is allocated.
|
||||
"""
|
||||
# Add an unique property to identify the Weight instances
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"True if it is a valid tank instance, False otherwise",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyBool",
|
||||
"IsTank",
|
||||
"Tank",
|
||||
tooltip).IsTank = True
|
||||
# Add the volume property (The volume of fluid will be set by each
|
||||
# loading condition)
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"Volume of fluid [m^3]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"Vol",
|
||||
"Tank",
|
||||
tooltip).Vol = 0.0
|
||||
# Add the density property (The volume of fluid will be set by each
|
||||
# loading condition)
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"Density [kg / m^3]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"Dens",
|
||||
"Tank",
|
||||
tooltip).Dens = 0.0
|
||||
# Set the subshapes
|
||||
obj.Shape = Part.makeCompound(shapes)
|
||||
|
||||
obj.Proxy = self
|
||||
|
||||
def onChanged(self, fp, prop):
|
||||
"""Detects the ship data changes.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
if prop == "Vol":
|
||||
pass
|
||||
|
||||
def execute(self, fp):
|
||||
"""Detects the entity recomputations.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
"""
|
||||
pass
|
||||
|
||||
def setFillingLevel(self, fp, level):
|
||||
"""Compute the mass of the object, already taking into account the
|
||||
type of subentities.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
level -- Percentage of filling level (from 0 to 100).
|
||||
"""
|
||||
shape = fp.Shape
|
||||
solids = shape.Solids
|
||||
|
||||
# Get the cutting box
|
||||
bbox = shape.BoundBox
|
||||
z_min = bbox.ZMin
|
||||
z_max = bbox.ZMax
|
||||
dx = bbox.XMax - bbox.XMin
|
||||
dy = bbox.YMax - bbox.YMin
|
||||
dz = level / 100.0 * (z_max - z_min)
|
||||
z = z_min + dz
|
||||
try:
|
||||
box = Part.makeBox(3.0 * dx,
|
||||
3.0 * dy,
|
||||
(z_max - z_min) + dz,
|
||||
Vector(bbox.XMin - dx,
|
||||
bbox.YMin - dy,
|
||||
bbox.ZMin - (z_max - z_min)))
|
||||
except:
|
||||
fp.Vol = 0.0
|
||||
return Units.parseQuantity('0 m^3')
|
||||
|
||||
# Start computing the common part of each solid component with the
|
||||
# cutting box, adding the volume
|
||||
vol = 0.0
|
||||
for s in solids:
|
||||
try:
|
||||
fluid = s.common(box)
|
||||
v = fluid.Volume
|
||||
except:
|
||||
v = 0.0
|
||||
vol += v
|
||||
|
||||
# Get the volume quantity and store it with the right units
|
||||
vol = Units.Quantity(vol, Units.Volume)
|
||||
fp.Vol = vol.getValueAs("m^3").Value
|
||||
|
||||
return vol
|
||||
|
||||
|
||||
class ViewProviderTank:
|
||||
def __init__(self, obj):
|
||||
"""Add this view provider to the selected object.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Object which must be modified.
|
||||
"""
|
||||
obj.Proxy = self
|
||||
|
||||
def attach(self, obj):
|
||||
"""Setup the scene sub-graph of the view provider, this method is
|
||||
mandatory.
|
||||
"""
|
||||
return
|
||||
|
||||
def updateData(self, fp, prop):
|
||||
"""If a property of the handled feature has changed we have the chance
|
||||
to handle this here.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
return
|
||||
|
||||
def getDisplayModes(self, obj):
|
||||
"""Return a list of display modes.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Object associated with the view provider.
|
||||
"""
|
||||
modes = []
|
||||
return modes
|
||||
|
||||
def getDefaultDisplayMode(self):
|
||||
"""Return the name of the default display mode. It must be defined in
|
||||
getDisplayModes."""
|
||||
return "Shaded"
|
||||
|
||||
def setDisplayMode(self, mode):
|
||||
"""Map the display mode defined in attach with those defined in
|
||||
getDisplayModes. Since they have the same names nothing needs to be
|
||||
done. This method is optinal.
|
||||
|
||||
Keyword arguments:
|
||||
mode -- Mode to be activated.
|
||||
"""
|
||||
return mode
|
||||
|
||||
def onChanged(self, vp, prop):
|
||||
"""Detects the ship view provider data changes.
|
||||
|
||||
Keyword arguments:
|
||||
vp -- View provider object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
pass
|
||||
|
||||
def __getstate__(self):
|
||||
"""When saving the document this object gets stored using Python's
|
||||
cPickle module. Since we have some un-pickable here (the Coin stuff)
|
||||
we must define this method to return a tuple of all pickable objects
|
||||
or None.
|
||||
"""
|
||||
return None
|
||||
|
||||
def __setstate__(self, state):
|
||||
"""When restoring the pickled object from document we have the chance
|
||||
to set some internals here. Since no data were pickled nothing needs
|
||||
to be done here.
|
||||
"""
|
||||
return None
|
||||
|
||||
def getIcon(self):
|
||||
"""Returns the icon for this kind of objects."""
|
||||
return ":/icons/Ship_Tank.svg"
|
353
src/Mod/Ship/WeightInstance.py
Normal file
353
src/Mod/Ship/WeightInstance.py
Normal file
|
@ -0,0 +1,353 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import time
|
||||
from math import *
|
||||
from PySide import QtGui, QtCore
|
||||
from pivy.coin import *
|
||||
from pivy import coin
|
||||
import FreeCAD
|
||||
import FreeCADGui
|
||||
from FreeCAD import Base, Vector
|
||||
import Part
|
||||
import Units
|
||||
from shipUtils import Paths, Math
|
||||
|
||||
|
||||
class Weight:
|
||||
def __init__(self, obj, shapes, ship):
|
||||
""" Transform a generic object to a ship instance.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Part::FeaturePython created object which should be transformed
|
||||
in a weight instance.
|
||||
shapes -- Set of shapes which will compound the weight element.
|
||||
ship -- Ship where the weight is allocated.
|
||||
"""
|
||||
# Add an unique property to identify the Weight instances
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"True if it is a valid weight instance, False otherwise",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyBool",
|
||||
"IsWeight",
|
||||
"Weight",
|
||||
tooltip).IsWeight = True
|
||||
# Add the mass property for puntual weights
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Mass [kg]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"Mass",
|
||||
"Weight",
|
||||
tooltip).Mass = 0.0
|
||||
# Add the density property for linear elements
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Linear density [kg / m]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"LineDens",
|
||||
"Weight",
|
||||
tooltip).LineDens = 0.0
|
||||
# Add the area density property for surface elements
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Area density [kg / m^3]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"AreaDens",
|
||||
"Weight",
|
||||
tooltip).AreaDens = 0.0
|
||||
# Add the density property for volumetric elements
|
||||
tooltip = str(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Density [kg / m^3]",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
obj.addProperty("App::PropertyFloat",
|
||||
"Dens",
|
||||
"Weight",
|
||||
tooltip).Dens = 0.0
|
||||
# Set the subshapes
|
||||
obj.Shape = Part.makeCompound(shapes)
|
||||
|
||||
obj.Proxy = self
|
||||
|
||||
def onChanged(self, fp, prop):
|
||||
"""Detects the ship data changes.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
if prop == "Mass":
|
||||
pass
|
||||
|
||||
def execute(self, fp):
|
||||
"""Detects the entity recomputations.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
"""
|
||||
pass
|
||||
|
||||
def _getPuntualMass(self, fp, shape):
|
||||
"""Compute the mass of a puntual element.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Vertex shape object.
|
||||
"""
|
||||
return Units.parseQuantity('{0} kg'.format(fp.Mass))
|
||||
|
||||
def _getLinearMass(self, fp, shape):
|
||||
"""Compute the mass of a linear element.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Edge shape object.
|
||||
"""
|
||||
rho = Units.parseQuantity('{0} kg/m'.format(fp.LineDens))
|
||||
l = Units.Quantity(shape.Length, Units.Length)
|
||||
return rho * l
|
||||
|
||||
def _getAreaMass(self, fp, shape):
|
||||
"""Compute the mass of an area element.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Face shape object.
|
||||
"""
|
||||
rho = Units.parseQuantity('{0} kg/m^2'.format(fp.AreaDens))
|
||||
a = Units.Quantity(shape.Area, Units.Area)
|
||||
return rho * a
|
||||
|
||||
def _getVolumetricMass(self, fp, shape):
|
||||
"""Compute the mass of a volumetric element.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Solid shape object.
|
||||
"""
|
||||
rho = Units.parseQuantity('{0} kg/m^3'.format(fp.Dens))
|
||||
v = Units.Quantity(shape.Volume, Units.Volume)
|
||||
return rho * v
|
||||
|
||||
def getMass(self, fp):
|
||||
"""Compute the mass of the object, already taking into account the
|
||||
type of subentities.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
"""
|
||||
m = Units.parseQuantity('0 kg')
|
||||
for s in fp.Shape.Solids:
|
||||
m = m + self._getVolumetricMass(fp, s)
|
||||
for f in fp.Shape.Faces:
|
||||
m = m + self._getAreaMass(fp, f)
|
||||
for e in fp.Shape.Edges:
|
||||
m = m + self._getLinearMass(fp, e)
|
||||
for v in fp.Shape.Vertexes:
|
||||
m = m + self._getPuntualMass(fp, v)
|
||||
return m
|
||||
|
||||
def _getPuntualMoment(self, fp, shape):
|
||||
"""Compute the moment of a puntual element (respect to 0, 0, 0).
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Vertex shape object.
|
||||
"""
|
||||
m = self._getPuntualMass(fp, shape)
|
||||
x = Units.Quantity(shape.X, Units.Length)
|
||||
y = Units.Quantity(shape.Y, Units.Length)
|
||||
z = Units.Quantity(shape.Z, Units.Length)
|
||||
return (m * x, m * y, m * z)
|
||||
|
||||
def _getLinearMoment(self, fp, shape):
|
||||
"""Compute the mass of a linear element (respect to 0, 0, 0).
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Edge shape object.
|
||||
"""
|
||||
m = self._getLinearMass(fp, shape)
|
||||
cog = shape.CenterOfMass
|
||||
x = Units.Quantity(cog.x, Units.Length)
|
||||
y = Units.Quantity(cog.y, Units.Length)
|
||||
z = Units.Quantity(cog.z, Units.Length)
|
||||
return (m * x, m * y, m * z)
|
||||
|
||||
def _getAreaMoment(self, fp, shape):
|
||||
"""Compute the mass of an area element (respect to 0, 0, 0).
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Face shape object.
|
||||
"""
|
||||
m = self._getAreaMass(fp, shape)
|
||||
cog = shape.CenterOfMass
|
||||
x = Units.Quantity(cog.x, Units.Length)
|
||||
y = Units.Quantity(cog.y, Units.Length)
|
||||
z = Units.Quantity(cog.z, Units.Length)
|
||||
return (m * x, m * y, m * z)
|
||||
|
||||
def _getVolumetricMoment(self, fp, shape):
|
||||
"""Compute the mass of a volumetric element (respect to 0, 0, 0).
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
shape -- Solid shape object.
|
||||
"""
|
||||
m = self._getVolumetricMass(fp, shape)
|
||||
cog = shape.CenterOfMass
|
||||
x = Units.Quantity(cog.x, Units.Length)
|
||||
y = Units.Quantity(cog.y, Units.Length)
|
||||
z = Units.Quantity(cog.z, Units.Length)
|
||||
return (m * x, m * y, m * z)
|
||||
|
||||
def getMoment(self, fp):
|
||||
"""Compute the mass of the object, already taking into account the
|
||||
type of subentities.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
"""
|
||||
m = [Units.parseQuantity('0 kg*m'),
|
||||
Units.parseQuantity('0 kg*m'),
|
||||
Units.parseQuantity('0 kg*m')]
|
||||
for s in fp.Shape.Solids:
|
||||
mom = self._getVolumetricMoment(fp, s)
|
||||
for i in range(len(m)):
|
||||
m[i] = m[i] + mom[i]
|
||||
for f in fp.Shape.Faces:
|
||||
mom = self._getAreaMoment(fp, f)
|
||||
for i in range(len(m)):
|
||||
m[i] = m[i] + mom[i]
|
||||
for e in fp.Shape.Edges:
|
||||
mom = self._getLinearMoment(fp, e)
|
||||
for i in range(len(m)):
|
||||
m[i] = m[i] + mom[i]
|
||||
for v in fp.Shape.Vertexes:
|
||||
mom = self._getPuntualMoment(fp, v)
|
||||
for i in range(len(m)):
|
||||
m[i] = m[i] + mom[i]
|
||||
return m
|
||||
|
||||
def getCenterOfMass(self, fp):
|
||||
"""Compute the mass of the object, already taking into account the
|
||||
type of subentities.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
"""
|
||||
mass = self.getMass(fp)
|
||||
moment = self.getMoment(fp)
|
||||
cog = []
|
||||
for i in range(len(moment)):
|
||||
cog.append(moment[i] / mass)
|
||||
return cog
|
||||
|
||||
|
||||
class ViewProviderWeight:
|
||||
def __init__(self, obj):
|
||||
"""Add this view provider to the selected object.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Object which must be modified.
|
||||
"""
|
||||
obj.Proxy = self
|
||||
|
||||
def attach(self, obj):
|
||||
"""Setup the scene sub-graph of the view provider, this method is
|
||||
mandatory.
|
||||
"""
|
||||
return
|
||||
|
||||
def updateData(self, fp, prop):
|
||||
"""If a property of the handled feature has changed we have the chance
|
||||
to handle this here.
|
||||
|
||||
Keyword arguments:
|
||||
fp -- Part::FeaturePython object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
return
|
||||
|
||||
def getDisplayModes(self, obj):
|
||||
"""Return a list of display modes.
|
||||
|
||||
Keyword arguments:
|
||||
obj -- Object associated with the view provider.
|
||||
"""
|
||||
modes = []
|
||||
return modes
|
||||
|
||||
def getDefaultDisplayMode(self):
|
||||
"""Return the name of the default display mode. It must be defined in
|
||||
getDisplayModes."""
|
||||
return "Shaded"
|
||||
|
||||
def setDisplayMode(self, mode):
|
||||
"""Map the display mode defined in attach with those defined in
|
||||
getDisplayModes. Since they have the same names nothing needs to be
|
||||
done. This method is optinal.
|
||||
|
||||
Keyword arguments:
|
||||
mode -- Mode to be activated.
|
||||
"""
|
||||
return mode
|
||||
|
||||
def onChanged(self, vp, prop):
|
||||
"""Detects the ship view provider data changes.
|
||||
|
||||
Keyword arguments:
|
||||
vp -- View provider object affected.
|
||||
prop -- Modified property name.
|
||||
"""
|
||||
pass
|
||||
|
||||
def __getstate__(self):
|
||||
"""When saving the document this object gets stored using Python's
|
||||
cPickle module. Since we have some un-pickable here (the Coin stuff)
|
||||
we must define this method to return a tuple of all pickable objects
|
||||
or None.
|
||||
"""
|
||||
return None
|
||||
|
||||
def __setstate__(self, state):
|
||||
"""When restoring the pickled object from document we have the chance
|
||||
to set some internals here. Since no data were pickled nothing needs
|
||||
to be done here.
|
||||
"""
|
||||
return None
|
||||
|
||||
def getIcon(self):
|
||||
"""Returns the icon for this kind of objects."""
|
||||
return ":/icons/Ship_Weight.svg"
|
|
@ -1,12 +1,16 @@
|
|||
<RCC>
|
||||
<qresource>
|
||||
<file>icons/Ship_AreaCurve.svg</file>
|
||||
<file>icons/Ship_CapacityCurve.svg</file>
|
||||
<file>icons/Ship_Instance.svg</file>
|
||||
<file>icons/Ship_GZ.svg</file>
|
||||
<file>icons/Ship_Hydrostatics.svg</file>
|
||||
<file>icons/Ship_Load.svg</file>
|
||||
<file>icons/Ship_Logo.svg</file>
|
||||
<file>icons/Ship_Module.svg</file>
|
||||
<file>icons/Ship_OutlineDraw.svg</file>
|
||||
<file>icons/Ship_Tank.svg</file>
|
||||
<file>icons/Ship_Weight.svg</file>
|
||||
<file>translations/Ship.qm</file>
|
||||
<file>translations/Ship_af.qm</file>
|
||||
<file>translations/Ship_cs.qm</file>
|
||||
|
|
757
src/Mod/Ship/resources/icons/Ship_CapacityCurve.svg
Normal file
757
src/Mod/Ship/resources/icons/Ship_CapacityCurve.svg
Normal file
|
@ -0,0 +1,757 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg2985"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="Ship_CapacityCurve.svg">
|
||||
<defs
|
||||
id="defs2987">
|
||||
<linearGradient
|
||||
id="linearGradient4113">
|
||||
<stop
|
||||
id="stop4115"
|
||||
offset="0"
|
||||
style="stop-color:#6f6f6f;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4117"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4081">
|
||||
<stop
|
||||
id="stop4083"
|
||||
offset="0"
|
||||
style="stop-color:#808080;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4085"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4049">
|
||||
<stop
|
||||
id="stop4051"
|
||||
offset="0"
|
||||
style="stop-color:#c1c1c1;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4053"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4015">
|
||||
<stop
|
||||
style="stop-color:#585858;stop-opacity:0.50196081;"
|
||||
offset="0"
|
||||
id="stop4017" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;"
|
||||
offset="1"
|
||||
id="stop4019" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3968">
|
||||
<stop
|
||||
id="stop3970"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#828282;stop-opacity:1;"
|
||||
offset="0.54039383"
|
||||
id="stop3976" />
|
||||
<stop
|
||||
style="stop-color:#606060;stop-opacity:1;"
|
||||
offset="0.77134961"
|
||||
id="stop3974" />
|
||||
<stop
|
||||
id="stop3972"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3911">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3913" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3915" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3903">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3905" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3907" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4722">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4724" />
|
||||
<stop
|
||||
style="stop-color:#bebebe;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4726" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Mend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3873"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.4) rotate(180) translate(10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3867"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3937">
|
||||
<stop
|
||||
style="stop-color:#be7328;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3939" />
|
||||
<stop
|
||||
style="stop-color:#dc962d;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3941" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3929">
|
||||
<stop
|
||||
id="stop3931"
|
||||
offset="0"
|
||||
style="stop-color:#c88c3c;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3933"
|
||||
offset="1"
|
||||
style="stop-color:#ffff96;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3893">
|
||||
<stop
|
||||
style="stop-color:#505050;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3895" />
|
||||
<stop
|
||||
style="stop-color:#aaaaaa;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3897" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3873">
|
||||
<stop
|
||||
style="stop-color:#f0be6e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3875" />
|
||||
<stop
|
||||
style="stop-color:#c88228;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3877" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3863">
|
||||
<stop
|
||||
id="stop3865"
|
||||
offset="0"
|
||||
style="stop-color:#6e4b18;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3867"
|
||||
offset="1"
|
||||
style="stop-color:#c88228;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3979">
|
||||
<stop
|
||||
id="stop3981"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3983"
|
||||
offset="1"
|
||||
style="stop-color:#ff9600;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3971">
|
||||
<stop
|
||||
id="stop3973"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3975"
|
||||
offset="1"
|
||||
style="stop-color:#be7300;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4031"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.2) rotate(180) translate(6,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4049"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) rotate(180) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Sstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4046"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4040"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) translate(0,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3900">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3902" />
|
||||
<stop
|
||||
style="stop-color:#a0a0a0;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3904" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3882">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3884" />
|
||||
<stop
|
||||
style="stop-color:#960000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3886" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3860">
|
||||
<stop
|
||||
style="stop-color:#1e76e3;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3860-6"
|
||||
id="linearGradient3866-5"
|
||||
x1="31.125395"
|
||||
y1="61.410763"
|
||||
x2="30.113636"
|
||||
y2="12.160761"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient3860-6">
|
||||
<stop
|
||||
style="stop-color:#5a9ff5;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862-4" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864-4" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3873"
|
||||
id="linearGradient3871"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="38.907837"
|
||||
y1="51.470051"
|
||||
x2="45.302406"
|
||||
y2="54.091148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3863"
|
||||
id="linearGradient3891"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3893"
|
||||
id="linearGradient3899"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3882"
|
||||
id="radialGradient3903"
|
||||
cx="53.748837"
|
||||
cy="4.9173141"
|
||||
fx="53.748837"
|
||||
fy="4.9173141"
|
||||
r="3.2874005"
|
||||
gradientTransform="matrix(2.3303929,-1.4921636,1.0936999,1.7080907,-77.643882,78.644487)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3927"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3943"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3949"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3951"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend-3"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3873-0"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4722"
|
||||
id="radialGradient4730"
|
||||
cx="22.399223"
|
||||
cy="27.920977"
|
||||
fx="22.399223"
|
||||
fy="27.920977"
|
||||
r="25.5625"
|
||||
gradientTransform="matrix(0.61346721,-0.22517965,0.21191717,0.57733561,2.1543769,16.986575)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3909"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3917"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3928"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3930"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3935"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3938"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3968"
|
||||
id="radialGradient3952"
|
||||
cx="30.228815"
|
||||
cy="20.070992"
|
||||
fx="30.228815"
|
||||
fy="20.070992"
|
||||
r="3.4475341"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2238696,-8.502217e-5,8.5302128e-5,1.2278995,-6.7690238,-4.5715991)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4021"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4047"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4079"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4111"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4143"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4180"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4182"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4184"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4186"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4188"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4219"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4221"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4223"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4225"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4227"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437" />
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend-9"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3873-03"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker3057"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3059"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6568543"
|
||||
inkscape:cx="1.0735984"
|
||||
inkscape:cy="23.39195"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1364"
|
||||
inkscape:window-height="718"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata2990">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g4210"
|
||||
transform="translate(3.1819805,-1.5909902)">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3104-9-2"
|
||||
d="M 31.625,23.78125 0.5,32.0625 l 0,12.34375 7.75,6.125 26.1875,12.96875 18.75,-5.03125 4.625,-9.5625 0,-12.125 z"
|
||||
style="fill:#6ba1ff;fill-opacity:1;stroke:none" />
|
||||
<g
|
||||
id="g4163">
|
||||
<path
|
||||
style="fill:url(#linearGradient4219);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 26.6875,57.40901 0,-26.81526 6.5,-8.875 18.93725,-5.0625 5.68775,5.65625 0,26.59651 -4.625,9.55974 -18.75,5.03125 z"
|
||||
id="path3104"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4221);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 33.1875,21.71875 7,8.75 25.9375,3.65625 l 26.187251,13 z"
|
||||
id="path3104-9-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4223);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 33.1875,21.71875 7,8.7499997 0.5,17.625 l 0,0 26.1875,12.96875 z"
|
||||
id="path3104-9-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4225);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 0.5,17.625 26.1875,12.96875 0,26.81526 -26.1875,-13 z"
|
||||
id="path3104-9-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4227);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 26.6875,57.40901 0.5,44.40901 8.25,50.53125 34.4375,63.5 z"
|
||||
id="path3104-9-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#ff0000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
d="m 2.6516504,61.525126 c 36.9463286,0 31.6430276,-56.0382116 55.8614356,-56.0382116"
|
||||
id="path3131"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||
d="m 2.5302756,63.080267 0,-58.3749999"
|
||||
id="path3066"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||
d="m 1.2802756,61.830267 58.3750004,0"
|
||||
id="path3066-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
1041
src/Mod/Ship/resources/icons/Ship_GZ.svg
Normal file
1041
src/Mod/Ship/resources/icons/Ship_GZ.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 34 KiB |
713
src/Mod/Ship/resources/icons/Ship_Tank.svg
Normal file
713
src/Mod/Ship/resources/icons/Ship_Tank.svg
Normal file
|
@ -0,0 +1,713 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg2985"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="Ship_Tank.svg">
|
||||
<defs
|
||||
id="defs2987">
|
||||
<linearGradient
|
||||
id="linearGradient4113">
|
||||
<stop
|
||||
id="stop4115"
|
||||
offset="0"
|
||||
style="stop-color:#6f6f6f;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4117"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4081">
|
||||
<stop
|
||||
id="stop4083"
|
||||
offset="0"
|
||||
style="stop-color:#808080;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4085"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4049">
|
||||
<stop
|
||||
id="stop4051"
|
||||
offset="0"
|
||||
style="stop-color:#c1c1c1;stop-opacity:0.50196081;" />
|
||||
<stop
|
||||
id="stop4053"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4015">
|
||||
<stop
|
||||
style="stop-color:#585858;stop-opacity:0.50196081;"
|
||||
offset="0"
|
||||
id="stop4017" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.50196081;"
|
||||
offset="1"
|
||||
id="stop4019" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3968">
|
||||
<stop
|
||||
id="stop3970"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#828282;stop-opacity:1;"
|
||||
offset="0.54039383"
|
||||
id="stop3976" />
|
||||
<stop
|
||||
style="stop-color:#606060;stop-opacity:1;"
|
||||
offset="0.77134961"
|
||||
id="stop3974" />
|
||||
<stop
|
||||
id="stop3972"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3911">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3913" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3915" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3903">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3905" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3907" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4722">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4724" />
|
||||
<stop
|
||||
style="stop-color:#bebebe;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4726" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Mend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3873"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.4) rotate(180) translate(10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3867"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3937">
|
||||
<stop
|
||||
style="stop-color:#be7328;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3939" />
|
||||
<stop
|
||||
style="stop-color:#dc962d;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3941" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3929">
|
||||
<stop
|
||||
id="stop3931"
|
||||
offset="0"
|
||||
style="stop-color:#c88c3c;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3933"
|
||||
offset="1"
|
||||
style="stop-color:#ffff96;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3893">
|
||||
<stop
|
||||
style="stop-color:#505050;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3895" />
|
||||
<stop
|
||||
style="stop-color:#aaaaaa;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3897" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3873">
|
||||
<stop
|
||||
style="stop-color:#f0be6e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3875" />
|
||||
<stop
|
||||
style="stop-color:#c88228;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3877" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3863">
|
||||
<stop
|
||||
id="stop3865"
|
||||
offset="0"
|
||||
style="stop-color:#6e4b18;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3867"
|
||||
offset="1"
|
||||
style="stop-color:#c88228;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3979">
|
||||
<stop
|
||||
id="stop3981"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3983"
|
||||
offset="1"
|
||||
style="stop-color:#ff9600;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3971">
|
||||
<stop
|
||||
id="stop3973"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3975"
|
||||
offset="1"
|
||||
style="stop-color:#be7300;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4031"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.2) rotate(180) translate(6,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4049"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) rotate(180) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Sstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4046"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4040"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) translate(0,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3900">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3902" />
|
||||
<stop
|
||||
style="stop-color:#a0a0a0;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3904" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3882">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3884" />
|
||||
<stop
|
||||
style="stop-color:#960000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3886" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3860">
|
||||
<stop
|
||||
style="stop-color:#1e76e3;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3860-6"
|
||||
id="linearGradient3866-5"
|
||||
x1="31.125395"
|
||||
y1="61.410763"
|
||||
x2="30.113636"
|
||||
y2="12.160761"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient3860-6">
|
||||
<stop
|
||||
style="stop-color:#5a9ff5;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862-4" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864-4" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3873"
|
||||
id="linearGradient3871"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="38.907837"
|
||||
y1="51.470051"
|
||||
x2="45.302406"
|
||||
y2="54.091148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3863"
|
||||
id="linearGradient3891"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3893"
|
||||
id="linearGradient3899"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3882"
|
||||
id="radialGradient3903"
|
||||
cx="53.748837"
|
||||
cy="4.9173141"
|
||||
fx="53.748837"
|
||||
fy="4.9173141"
|
||||
r="3.2874005"
|
||||
gradientTransform="matrix(2.3303929,-1.4921636,1.0936999,1.7080907,-77.643882,78.644487)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3927"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3943"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3949"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3951"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend-3"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3873-0"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4722"
|
||||
id="radialGradient4730"
|
||||
cx="22.399223"
|
||||
cy="27.920977"
|
||||
fx="22.399223"
|
||||
fy="27.920977"
|
||||
r="25.5625"
|
||||
gradientTransform="matrix(0.61346721,-0.22517965,0.21191717,0.57733561,2.1543769,16.986575)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3909"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3917"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3928"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3930"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3935"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3938"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3968"
|
||||
id="radialGradient3952"
|
||||
cx="30.228815"
|
||||
cy="20.070992"
|
||||
fx="30.228815"
|
||||
fy="20.070992"
|
||||
r="3.4475341"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2238696,-8.502217e-5,8.5302128e-5,1.2278995,-6.7690238,-4.5715991)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4021"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4047"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4079"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4111"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4143"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4180"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4182"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4184"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4186"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4188"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4219"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="53.411106"
|
||||
y1="58.639683"
|
||||
x2="32.679878"
|
||||
y2="21.516573" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4221"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="20.465359"
|
||||
y1="-8.8792562"
|
||||
x2="33.356091"
|
||||
y2="21.526335" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4223"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="3.5355339"
|
||||
y1="17.904108"
|
||||
x2="33.157169"
|
||||
y2="22.146749" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4225"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="11.667262"
|
||||
y1="37.693783"
|
||||
x2="32.844353"
|
||||
y2="22.137434" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4015"
|
||||
id="linearGradient4227"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="19.445436"
|
||||
y1="39.81237"
|
||||
x2="32.639404"
|
||||
y2="21.60437" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6568543"
|
||||
inkscape:cx="24.081219"
|
||||
inkscape:cy="26.677376"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1364"
|
||||
inkscape:window-height="718"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata2990">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g4210"
|
||||
transform="translate(3.1819805,-1.5909902)">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3104-9-2"
|
||||
d="M 31.625,23.78125 0.5,32.0625 l 0,12.34375 7.75,6.125 26.1875,12.96875 18.75,-5.03125 4.625,-9.5625 0,-12.125 z"
|
||||
style="fill:#6ba1ff;fill-opacity:1;stroke:none" />
|
||||
<g
|
||||
id="g4163">
|
||||
<path
|
||||
style="fill:url(#linearGradient4219);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 26.6875,57.40901 0,-26.81526 6.5,-8.875 18.93725,-5.0625 5.68775,5.65625 0,26.59651 -4.625,9.55974 -18.75,5.03125 z"
|
||||
id="path3104"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4221);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 33.1875,21.71875 7,8.75 25.9375,3.65625 l 26.187251,13 z"
|
||||
id="path3104-9-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4223);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 33.1875,21.71875 7,8.7499997 0.5,17.625 l 0,0 26.1875,12.96875 z"
|
||||
id="path3104-9-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4225);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 0.5,17.625 26.1875,12.96875 0,26.81526 -26.1875,-13 z"
|
||||
id="path3104-9-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4227);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 26.6875,57.40901 0.5,44.40901 8.25,50.53125 34.4375,63.5 z"
|
||||
id="path3104-9-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 22 KiB |
521
src/Mod/Ship/resources/icons/Ship_Weight.svg
Normal file
521
src/Mod/Ship/resources/icons/Ship_Weight.svg
Normal file
|
@ -0,0 +1,521 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg2985"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="Ship_Weight.svg">
|
||||
<defs
|
||||
id="defs2987">
|
||||
<linearGradient
|
||||
id="linearGradient3968">
|
||||
<stop
|
||||
id="stop3970"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#828282;stop-opacity:1;"
|
||||
offset="0.54039383"
|
||||
id="stop3976" />
|
||||
<stop
|
||||
style="stop-color:#606060;stop-opacity:1;"
|
||||
offset="0.77134961"
|
||||
id="stop3974" />
|
||||
<stop
|
||||
id="stop3972"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3911">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3913" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3915" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3903">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3905" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3907" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4722">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4724" />
|
||||
<stop
|
||||
style="stop-color:#bebebe;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4726" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Mend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3873"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.4) rotate(180) translate(10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path3867"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.8) rotate(180) translate(12.5,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3937">
|
||||
<stop
|
||||
style="stop-color:#be7328;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3939" />
|
||||
<stop
|
||||
style="stop-color:#dc962d;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3941" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3929">
|
||||
<stop
|
||||
id="stop3931"
|
||||
offset="0"
|
||||
style="stop-color:#c88c3c;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3933"
|
||||
offset="1"
|
||||
style="stop-color:#ffff96;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3893">
|
||||
<stop
|
||||
style="stop-color:#505050;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3895" />
|
||||
<stop
|
||||
style="stop-color:#aaaaaa;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3897" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3873">
|
||||
<stop
|
||||
style="stop-color:#f0be6e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3875" />
|
||||
<stop
|
||||
style="stop-color:#c88228;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3877" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3863">
|
||||
<stop
|
||||
id="stop3865"
|
||||
offset="0"
|
||||
style="stop-color:#6e4b18;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3867"
|
||||
offset="1"
|
||||
style="stop-color:#c88228;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3979">
|
||||
<stop
|
||||
id="stop3981"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3983"
|
||||
offset="1"
|
||||
style="stop-color:#ff9600;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3971">
|
||||
<stop
|
||||
id="stop3973"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3975"
|
||||
offset="1"
|
||||
style="stop-color:#be7300;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4031"
|
||||
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
|
||||
transform="scale(0.2) rotate(180) translate(6,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Send"
|
||||
style="overflow:visible;">
|
||||
<path
|
||||
id="path4049"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) rotate(180) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Sstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4046"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path4040"
|
||||
style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.6) translate(0,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient3900">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3902" />
|
||||
<stop
|
||||
style="stop-color:#a0a0a0;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3904" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3882">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3884" />
|
||||
<stop
|
||||
style="stop-color:#960000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3886" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3860">
|
||||
<stop
|
||||
style="stop-color:#1e76e3;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3860-6"
|
||||
id="linearGradient3866-5"
|
||||
x1="31.125395"
|
||||
y1="61.410763"
|
||||
x2="30.113636"
|
||||
y2="12.160761"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient3860-6">
|
||||
<stop
|
||||
style="stop-color:#5a9ff5;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3862-4" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3864-4" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3873"
|
||||
id="linearGradient3871"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="38.907837"
|
||||
y1="51.470051"
|
||||
x2="45.302406"
|
||||
y2="54.091148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3863"
|
||||
id="linearGradient3891"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3893"
|
||||
id="linearGradient3899"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="51.657837"
|
||||
y1="34.470051"
|
||||
x2="45.427406"
|
||||
y2="32.216148" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3882"
|
||||
id="radialGradient3903"
|
||||
cx="53.748837"
|
||||
cy="4.9173141"
|
||||
fx="53.748837"
|
||||
fy="4.9173141"
|
||||
r="3.2874005"
|
||||
gradientTransform="matrix(2.3303929,-1.4921636,1.0936999,1.7080907,-77.643882,78.644487)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3927"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3943"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3929"
|
||||
id="radialGradient3949"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.7636523,-0.71644256,0.733044,2.8276918,-61.887066,-71.992203)"
|
||||
cx="15.125"
|
||||
cy="48.035076"
|
||||
fx="15.125"
|
||||
fy="48.035076"
|
||||
r="18.875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3937"
|
||||
id="radialGradient3951"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.40097726,-0.37931652,0.11734116,0.12404187,14.422507,4.6205505)"
|
||||
cx="-14.308363"
|
||||
cy="14.910047"
|
||||
fx="-14.308363"
|
||||
fy="14.910047"
|
||||
r="18.875" />
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend-3"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3873-0"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4722"
|
||||
id="radialGradient4730"
|
||||
cx="22.399223"
|
||||
cy="27.920977"
|
||||
fx="22.399223"
|
||||
fy="27.920977"
|
||||
r="25.5625"
|
||||
gradientTransform="matrix(0.61346721,-0.22517965,0.21191717,0.57733561,2.1543769,16.986575)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3909"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3917"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3928"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3930"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3911"
|
||||
id="linearGradient3935"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="39.647182"
|
||||
y1="67.479065"
|
||||
x2="39.647182"
|
||||
y2="15.294641" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3903"
|
||||
id="linearGradient3938"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="33.267635"
|
||||
y1="23.615986"
|
||||
x2="33.267635"
|
||||
y2="63.06311" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3968"
|
||||
id="radialGradient3952"
|
||||
cx="30.228815"
|
||||
cy="20.070992"
|
||||
fx="30.228815"
|
||||
fy="20.070992"
|
||||
r="3.4475341"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2238696,-8.502217e-5,8.5302128e-5,1.2278995,-6.7690238,-4.5715991)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6568543"
|
||||
inkscape:cx="20.331522"
|
||||
inkscape:cy="42.580446"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1364"
|
||||
inkscape:window-height="718"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata2990">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:none;stroke:url(#radialGradient3952);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path3940"
|
||||
sodipodi:cx="30.228815"
|
||||
sodipodi:cy="20.070992"
|
||||
sodipodi:rx="3.2703688"
|
||||
sodipodi:ry="3.2703688"
|
||||
d="m 33.499184,20.070992 a 3.2703688,3.2703688 0 1 1 -6.540738,0 3.2703688,3.2703688 0 1 1 6.540738,0 z"
|
||||
transform="matrix(1.2561254,0,0,1.2561254,-5.1034967,-6.625066)" />
|
||||
<g
|
||||
id="g3978">
|
||||
<path
|
||||
sodipodi:nodetypes="sccscsccscs"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3066"
|
||||
d="m 20.25,23.455583 c -2.875,0 -3.082092,0.515104 -4.625,3.1875 L 7.5,45.125 C 6.2093353,48.234896 5.1249999,51 9.75,51 L 33,51 56.09375,51 c 4.625001,0 3.700055,-2.632521 2.25,-5.8125 l -8.125,-18.481917 c -1.542908,-2.672396 -1.75,-3.25 -4.625,-3.25 l -12.59375,0 z"
|
||||
style="fill:url(#linearGradient3935);fill-opacity:1;stroke:url(#linearGradient3938);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text3919"
|
||||
y="42.5"
|
||||
x="20.625"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="42.5"
|
||||
x="20.625"
|
||||
id="tspan3921"
|
||||
sodipodi:role="line">kg.</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -116,11 +116,8 @@ class Plot(object):
|
|||
@param ship Active ship instance.
|
||||
"""
|
||||
# Create the spreadsheet
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Spreadsheet")
|
||||
s = Spreadsheet.Spreadsheet(obj)
|
||||
if FreeCAD.GuiUp:
|
||||
Spreadsheet.ViewProviderSpreadsheet(obj.ViewObject)
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
obj = Spreadsheet.makeSpreadsheet()
|
||||
s = obj.Proxy
|
||||
obj.Label = 'Areas curve'
|
||||
|
||||
# Print the header
|
||||
|
|
|
@ -31,6 +31,7 @@ import PlotAux
|
|||
import Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
import shipUtils.Locale as Locale
|
||||
from shipHydrostatics import Tools as Hydrostatics
|
||||
|
||||
|
||||
|
@ -180,23 +181,23 @@ class TaskPanel:
|
|||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.draft = self.widget(QtGui.QLineEdit, "Draft")
|
||||
form.trim = self.widget(QtGui.QLineEdit, "Trim")
|
||||
form.draft.setText(length_format.format(
|
||||
self.ship.Draft.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.trim.setText(angle_format.format(0.0))
|
||||
form.draft.setText(Locale.toString(length_format.format(
|
||||
self.ship.Draft.getValueAs(USys.getLengthUnits()).Value)))
|
||||
form.trim.setText(Locale.toString(angle_format.format(0.0)))
|
||||
# Try to use saved values
|
||||
props = self.ship.PropertiesList
|
||||
try:
|
||||
props.index("AreaCurveDraft")
|
||||
form.draft.setText(length_format.format(
|
||||
form.draft.setText(Locale.toString(length_format.format(
|
||||
self.ship.AreaCurveDraft.getValueAs(
|
||||
USys.getLengthUnits()).Value))
|
||||
USys.getLengthUnits()).Value)))
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
props.index("AreaCurveTrim")
|
||||
form.trim.setText(angle_format.format(
|
||||
form.trim.setText(Locale.toString(angle_format.format(
|
||||
self.ship.AreaCurveTrim.getValueAs(
|
||||
USys.getAngleUnits()).Value))
|
||||
USys.getAngleUnits()).Value)))
|
||||
except ValueError:
|
||||
pass
|
||||
# Update GUI
|
||||
|
@ -234,8 +235,8 @@ class TaskPanel:
|
|||
input_format = USys.getLengthFormat()
|
||||
val = min(val_max, max(val_min, val))
|
||||
qty = Units.Quantity('{} m'.format(val))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
return val
|
||||
|
||||
def clampAngle(self, widget, val_min, val_max, val):
|
||||
|
@ -244,8 +245,8 @@ class TaskPanel:
|
|||
input_format = USys.getAngleFormat()
|
||||
val = min(val_max, max(val_min, val))
|
||||
qty = Units.Quantity('{} deg'.format(val))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
return val
|
||||
|
||||
def onData(self, value):
|
||||
|
@ -267,16 +268,16 @@ class TaskPanel:
|
|||
draft = self.ship.Draft.getValueAs(USys.getLengthUnits()).Value
|
||||
input_format = USys.getLengthFormat()
|
||||
qty = Units.Quantity('{} m'.format(draft))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
try:
|
||||
trim = Units.Quantity(form.trim.text()).getValueAs('deg').Value
|
||||
except:
|
||||
trim = 0.0
|
||||
input_format = USys.getAngleFormat()
|
||||
qty = Units.Quantity('{} deg'.format(trim))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
|
||||
bbox = self.ship.Shape.BoundBox
|
||||
draft_min = bbox.ZMin / Units.Metre.Value
|
||||
|
|
127
src/Mod/Ship/shipCapacityCurve/PlotAux.py
Normal file
127
src/Mod/Ship/shipCapacityCurve/PlotAux.py
Normal file
|
@ -0,0 +1,127 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import os
|
||||
from PySide import QtGui, QtCore
|
||||
import FreeCAD
|
||||
import FreeCADGui
|
||||
from FreeCAD import Base
|
||||
import Spreadsheet
|
||||
|
||||
class Plot(object):
|
||||
def __init__(self, l, z, v, tank):
|
||||
""" Constructor. performs the plot and shows it.
|
||||
@param l Percentages of filling level.
|
||||
@param z Level z coordinates.
|
||||
@param v Volume of fluid.
|
||||
@param tank Active tank instance.
|
||||
"""
|
||||
self.plot(l, z, v, tank)
|
||||
self.spreadSheet(l, z, v, tank)
|
||||
|
||||
def plot(self, l, z, v, tank):
|
||||
""" Perform the areas curve plot.
|
||||
@param l Percentages of filling level.
|
||||
@param z Level z coordinates.
|
||||
@param v Volume of fluid.
|
||||
@param tank Active tank instance.
|
||||
@return True if error happens.
|
||||
"""
|
||||
try:
|
||||
import Plot
|
||||
plt = Plot.figure('Capacity curve')
|
||||
except ImportError:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_console",
|
||||
"Plot module is disabled, so I cannot perform the plot",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
FreeCAD.Console.PrintWarning(msg + '\n')
|
||||
return True
|
||||
|
||||
# Plot the volume as a function of the level percentage
|
||||
vols = Plot.plot(l, v, 'Capacity')
|
||||
vols.line.set_linestyle('-')
|
||||
vols.line.set_linewidth(2.0)
|
||||
vols.line.set_color((0.0, 0.0, 0.0))
|
||||
Plot.xlabel(r'Percentage of filling level')
|
||||
Plot.ylabel(r'$V \; [\mathrm{m}^3]$')
|
||||
plt.axes.xaxis.label.set_fontsize(20)
|
||||
plt.axes.yaxis.label.set_fontsize(20)
|
||||
Plot.grid(True)
|
||||
|
||||
# Now duplicate the axes
|
||||
ax = Plot.addNewAxes()
|
||||
# Y axis can be placed at right
|
||||
ax.yaxis.tick_right()
|
||||
ax.spines['right'].set_color((0.0, 0.0, 0.0))
|
||||
ax.spines['left'].set_color('none')
|
||||
ax.yaxis.set_ticks_position('right')
|
||||
ax.yaxis.set_label_position('right')
|
||||
# And X axis can be placed at top
|
||||
ax.xaxis.tick_top()
|
||||
ax.spines['top'].set_color((0.0, 0.0, 0.0))
|
||||
ax.spines['bottom'].set_color('none')
|
||||
ax.xaxis.set_ticks_position('top')
|
||||
ax.xaxis.set_label_position('top')
|
||||
|
||||
# Plot the volume as a function of the level z coordinate
|
||||
vols = Plot.plot(z, v, 'Capacity')
|
||||
vols.line.set_linestyle('-')
|
||||
vols.line.set_linewidth(2.0)
|
||||
vols.line.set_color((0.0, 0.0, 0.0))
|
||||
Plot.xlabel(r'$z \; [\mathrm{m}]$')
|
||||
Plot.ylabel(r'$V \; [\mathrm{m}^3]$')
|
||||
ax.xaxis.label.set_fontsize(20)
|
||||
ax.yaxis.label.set_fontsize(20)
|
||||
Plot.grid(True)
|
||||
|
||||
# End
|
||||
plt.update()
|
||||
return False
|
||||
|
||||
def spreadSheet(self, l, z, v, tank):
|
||||
""" Write the output data file.
|
||||
@param l Percentages of filling level.
|
||||
@param z Level z coordinates.
|
||||
@param v Volume of fluid.
|
||||
@param tank Active tank instance.
|
||||
"""
|
||||
# Create the spreadsheet
|
||||
obj = Spreadsheet.makeSpreadsheet()
|
||||
s = obj.Proxy
|
||||
obj.Label = 'Capacity curve'
|
||||
|
||||
# Print the header
|
||||
s.a1 = "Percentage of filling level"
|
||||
s.b1 = "Level [m]"
|
||||
s.c1 = "Volume [m^3]"
|
||||
|
||||
# Print the data
|
||||
for i in range(len(l)):
|
||||
s.__setattr__("a{}".format(i + 2), l[i])
|
||||
s.__setattr__("b{}".format(i + 2), z[i])
|
||||
s.__setattr__("c{}".format(i + 2), v[i])
|
||||
|
||||
# Open the spreadsheet
|
||||
FreeCADGui.ActiveDocument.setEdit(obj.Name, 0)
|
186
src/Mod/Ship/shipCapacityCurve/TaskPanel.py
Normal file
186
src/Mod/Ship/shipCapacityCurve/TaskPanel.py
Normal file
|
@ -0,0 +1,186 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import math
|
||||
import FreeCAD as App
|
||||
import FreeCADGui as Gui
|
||||
import Units
|
||||
from PySide import QtGui, QtCore
|
||||
import PlotAux
|
||||
import TankInstance as Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
|
||||
|
||||
class TaskPanel:
|
||||
def __init__(self):
|
||||
self.ui = Paths.modulePath() + "/shipCapacityCurve/TaskPanel.ui"
|
||||
self.tank = None
|
||||
|
||||
def accept(self):
|
||||
if self.tank is None:
|
||||
return False
|
||||
# Plot data
|
||||
l, z, v = self.compute()
|
||||
PlotAux.Plot(l, z, v, self.tank)
|
||||
return True
|
||||
|
||||
def reject(self):
|
||||
return True
|
||||
|
||||
def clicked(self, index):
|
||||
pass
|
||||
|
||||
def open(self):
|
||||
pass
|
||||
|
||||
def needsFullSpace(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterSelection(self):
|
||||
return False
|
||||
|
||||
def isAllowedAlterView(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterDocument(self):
|
||||
return False
|
||||
|
||||
def helpRequested(self):
|
||||
pass
|
||||
|
||||
def setupUi(self):
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.points = self.widget(QtGui.QSpinBox, "Points")
|
||||
self.form = form
|
||||
if self.initValues():
|
||||
return True
|
||||
self.retranslateUi()
|
||||
|
||||
def getMainWindow(self):
|
||||
toplevel = QtGui.qApp.topLevelWidgets()
|
||||
for i in toplevel:
|
||||
if i.metaObject().className() == "Gui::MainWindow":
|
||||
return i
|
||||
raise Exception("No main window found")
|
||||
|
||||
def widget(self, class_id, name):
|
||||
"""Return the selected widget.
|
||||
|
||||
Keyword arguments:
|
||||
class_id -- Class identifier
|
||||
name -- Name of the widget
|
||||
"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
return form.findChild(class_id, name)
|
||||
|
||||
def initValues(self):
|
||||
""" Set initial values for fields
|
||||
"""
|
||||
selObjs = Gui.Selection.getSelection()
|
||||
if not selObjs:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_console",
|
||||
"A tank instance must be selected before using this tool (no"
|
||||
" objects selected)",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
for i in range(0, len(selObjs)):
|
||||
obj = selObjs[i]
|
||||
props = obj.PropertiesList
|
||||
try:
|
||||
props.index("IsTank")
|
||||
except ValueError:
|
||||
continue
|
||||
if obj.IsTank:
|
||||
if self.tank:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_console",
|
||||
"More than one tank have been selected (the extra"
|
||||
" tanks will be ignored)",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintWarning(msg + '\n')
|
||||
break
|
||||
self.tank = obj
|
||||
if not self.tank:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_console",
|
||||
"A tank instance must be selected before using this tool (no"
|
||||
" valid tank found at the selected objects)",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
return False
|
||||
|
||||
def retranslateUi(self):
|
||||
""" Set user interface locale strings. """
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.setWindowTitle(QtGui.QApplication.translate(
|
||||
"ship_capacity",
|
||||
"Plot the tank capacity curve",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
self.widget(QtGui.QLabel, "PointsLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_capacity",
|
||||
"Number of points",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
def compute(self):
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.points = self.widget(QtGui.QSpinBox, "Points")
|
||||
|
||||
bbox = self.tank.Shape.BoundBox
|
||||
dz = Units.Quantity(bbox.ZMax - bbox.ZMin, Units.Length)
|
||||
|
||||
n = form.points.value()
|
||||
dlevel = 100.0 / (n - 1)
|
||||
l = [0.0]
|
||||
v = [0.0]
|
||||
z = [0.0]
|
||||
|
||||
for i in range(1, n):
|
||||
level = i * dlevel
|
||||
vol = self.tank.Proxy.setFillingLevel(self.tank, level)
|
||||
l.append(level)
|
||||
z.append(level / 100.0 * dz.getValueAs("m").Value)
|
||||
v.append(vol.getValueAs("m^3").Value)
|
||||
return (l, z, v)
|
||||
|
||||
|
||||
def createTask():
|
||||
panel = TaskPanel()
|
||||
Gui.Control.showDialog(panel)
|
||||
if panel.setupUi():
|
||||
Gui.Control.closeDialog(panel)
|
||||
return None
|
||||
return panel
|
51
src/Mod/Ship/shipCapacityCurve/TaskPanel.ui
Normal file
51
src/Mod/Ship/shipCapacityCurve/TaskPanel.ui
Normal file
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TaskPanel</class>
|
||||
<widget class="QWidget" name="TaskPanel">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>260</width>
|
||||
<height>128</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Capacity curve</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="PointsLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Number of points</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="Points">
|
||||
<property name="minimum">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>99999</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>51</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
29
src/Mod/Ship/shipCapacityCurve/__init__.py
Normal file
29
src/Mod/Ship/shipCapacityCurve/__init__.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import TaskPanel
|
||||
|
||||
|
||||
def load():
|
||||
""" Loads the tool """
|
||||
TaskPanel.createTask()
|
|
@ -29,6 +29,7 @@ import Preview
|
|||
import Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
import shipUtils.Locale as Locale
|
||||
|
||||
class TaskPanel:
|
||||
def __init__(self):
|
||||
|
@ -203,16 +204,16 @@ class TaskPanel:
|
|||
form.draft = self.widget(QtGui.QLineEdit, "Draft")
|
||||
|
||||
qty = Units.Quantity(self.bounds[0], Units.Length)
|
||||
form.length.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.length.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
self.L = self.bounds[0] / Units.Metre.Value
|
||||
qty = Units.Quantity(self.bounds[1], Units.Length)
|
||||
form.breadth.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.breadth.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
self.B = self.bounds[1] / Units.Metre.Value
|
||||
qty = Units.Quantity(self.bounds[2], Units.Length)
|
||||
form.draft.setText(input_format.format(
|
||||
0.5 * qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.draft.setText(Locale.toString(input_format.format(
|
||||
0.5 * qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
self.T = 0.5 * self.bounds[2] / Units.Metre.Value
|
||||
return False
|
||||
|
||||
|
@ -248,8 +249,8 @@ class TaskPanel:
|
|||
input_format = USys.getLengthFormat()
|
||||
val = min(val_max, max(val_min, val))
|
||||
qty = Units.Quantity('{} m'.format(val))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
return val
|
||||
|
||||
def onData(self, value):
|
||||
|
|
190
src/Mod/Ship/shipCreateTank/TaskPanel.py
Normal file
190
src/Mod/Ship/shipCreateTank/TaskPanel.py
Normal file
|
@ -0,0 +1,190 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD as App
|
||||
import FreeCADGui as Gui
|
||||
import Units
|
||||
from PySide import QtGui, QtCore
|
||||
import TankInstance as Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
|
||||
class TaskPanel:
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
self.ui = Paths.modulePath() + "/shipCreateTank/TaskPanel.ui"
|
||||
|
||||
def accept(self):
|
||||
"""Create the ship instance"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
|
||||
# Create the object
|
||||
ship = self.ships[form.ship.currentIndex()]
|
||||
obj = App.ActiveDocument.addObject("Part::FeaturePython", "Tank")
|
||||
tank = Instance.Tank(obj, self.solids, ship)
|
||||
Instance.ViewProviderTank(obj.ViewObject)
|
||||
|
||||
# Set it as a child of the ship
|
||||
tanks = ship.Tanks[:]
|
||||
tanks.append(obj.Name)
|
||||
ship.Tanks = tanks
|
||||
|
||||
App.ActiveDocument.recompute()
|
||||
return True
|
||||
|
||||
def reject(self):
|
||||
"""Cancel the job"""
|
||||
return True
|
||||
|
||||
def clicked(self, index):
|
||||
pass
|
||||
|
||||
def open(self):
|
||||
pass
|
||||
|
||||
def needsFullSpace(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterSelection(self):
|
||||
return False
|
||||
|
||||
def isAllowedAlterView(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterDocument(self):
|
||||
return False
|
||||
|
||||
def helpRequested(self):
|
||||
pass
|
||||
|
||||
def setupUi(self):
|
||||
"""Create and configurate the user interface"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
self.form = form
|
||||
if self.initValues():
|
||||
return True
|
||||
self.retranslateUi()
|
||||
|
||||
def getMainWindow(self):
|
||||
toplevel = QtGui.qApp.topLevelWidgets()
|
||||
for i in toplevel:
|
||||
if i.metaObject().className() == "Gui::MainWindow":
|
||||
return i
|
||||
raise Exception("No main window found")
|
||||
|
||||
def widget(self, class_id, name):
|
||||
"""Return the selected widget.
|
||||
|
||||
Keyword arguments:
|
||||
class_id -- Class identifier
|
||||
name -- Name of the widget
|
||||
"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
return form.findChild(class_id, name)
|
||||
|
||||
def initValues(self):
|
||||
"""Setup the initial values"""
|
||||
# Ensure that there are at least one valid object to generate the
|
||||
# tank
|
||||
selObjs = Gui.Selection.getSelection()
|
||||
self.solids = []
|
||||
if not selObjs:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"Tanks objects can only be created on top of its geometry"
|
||||
" (no objects selected)",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
for obj in selObjs:
|
||||
try:
|
||||
self.solids.extend(obj.Shape.Solids)
|
||||
except:
|
||||
continue
|
||||
if not len(self.solids):
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"No solids found in the selected objects",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
|
||||
# Ensure as well that exist at least one valid ship to create the
|
||||
# entity inside it
|
||||
self.ships = []
|
||||
for obj in App.ActiveDocument.Objects:
|
||||
try:
|
||||
if obj.IsShip:
|
||||
self.ships.append(obj)
|
||||
except:
|
||||
continue
|
||||
if not len(self.ships):
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"There are not ship objects to create weights into them",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
|
||||
# Fill the ships combo box
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
icon = QtGui.QIcon(QtGui.QPixmap(":/icons/Ship_Instance.svg"))
|
||||
form.ship.clear()
|
||||
for ship in self.ships:
|
||||
form.ship.addItem(icon, ship.Label)
|
||||
form.ship.setCurrentIndex(0)
|
||||
|
||||
return False
|
||||
|
||||
def retranslateUi(self):
|
||||
"""Set the user interface locale strings."""
|
||||
self.form.setWindowTitle(QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"Create a new tank",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
self.widget(QtGui.QLabel, "ShipLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_tank",
|
||||
"Ship",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
|
||||
def createTask():
|
||||
panel = TaskPanel()
|
||||
Gui.Control.showDialog(panel)
|
||||
if panel.setupUi():
|
||||
Gui.Control.closeDialog(panel)
|
||||
return None
|
||||
return panel
|
60
src/Mod/Ship/shipCreateTank/TaskPanel.ui
Normal file
60
src/Mod/Ship/shipCreateTank/TaskPanel.ui
Normal file
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TaskPanel</class>
|
||||
<widget class="QWidget" name="TaskPanel">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>260</width>
|
||||
<height>78</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Create new tank</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="ShipLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ship</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="Ship">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
29
src/Mod/Ship/shipCreateTank/__init__.py
Normal file
29
src/Mod/Ship/shipCreateTank/__init__.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import TaskPanel
|
||||
|
||||
|
||||
def load():
|
||||
"""Loads the tool in the task panel"""
|
||||
TaskPanel.createTask()
|
287
src/Mod/Ship/shipCreateWeight/TaskPanel.py
Normal file
287
src/Mod/Ship/shipCreateWeight/TaskPanel.py
Normal file
|
@ -0,0 +1,287 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD as App
|
||||
import FreeCADGui as Gui
|
||||
import Units
|
||||
from PySide import QtGui, QtCore
|
||||
import WeightInstance as Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
|
||||
class TaskPanel:
|
||||
def __init__(self):
|
||||
"""Constructor"""
|
||||
self.ui = Paths.modulePath() + "/shipCreateWeight/TaskPanel.ui"
|
||||
|
||||
def accept(self):
|
||||
"""Create the ship instance"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
form.weight = self.widget(QtGui.QLineEdit, "Weight")
|
||||
|
||||
# Create the object
|
||||
ship = self.ships[form.ship.currentIndex()]
|
||||
obj = App.ActiveDocument.addObject("Part::FeaturePython", "Weight")
|
||||
weight = Instance.Weight(obj, self.shapes, ship)
|
||||
Instance.ViewProviderWeight(obj.ViewObject)
|
||||
|
||||
# Set the mass/density
|
||||
m_unit = USys.getMassUnits()
|
||||
l_unit = USys.getLengthUnits()
|
||||
qty = Units.parseQuantity(form.weight.text())
|
||||
if self.elem_type == 1:
|
||||
w_unit = m_unit
|
||||
obj.Mass = qty.getValueAs(w_unit).Value
|
||||
elif self.elem_type == 2:
|
||||
w_unit = m_unit + '/' + l_unit
|
||||
obj.LineDens = qty.getValueAs(w_unit).Value
|
||||
elif self.elem_type == 3:
|
||||
w_unit = m_unit + '/' + l_unit + '^2'
|
||||
obj.AreaDens = qty.getValueAs(w_unit).Value
|
||||
elif self.elem_type == 4:
|
||||
w_unit = m_unit + '/' + l_unit + '^3'
|
||||
obj.Dens = qty.getValueAs(w_unit).Value
|
||||
|
||||
# Set it as a child of the ship
|
||||
weights = ship.Weights[:]
|
||||
weights.append(obj.Name)
|
||||
ship.Weights = weights
|
||||
|
||||
App.ActiveDocument.recompute()
|
||||
return True
|
||||
|
||||
def reject(self):
|
||||
"""Cancel the job"""
|
||||
return True
|
||||
|
||||
def clicked(self, index):
|
||||
pass
|
||||
|
||||
def open(self):
|
||||
pass
|
||||
|
||||
def needsFullSpace(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterSelection(self):
|
||||
return False
|
||||
|
||||
def isAllowedAlterView(self):
|
||||
return True
|
||||
|
||||
def isAllowedAlterDocument(self):
|
||||
return False
|
||||
|
||||
def helpRequested(self):
|
||||
pass
|
||||
|
||||
def setupUi(self):
|
||||
"""Create and configurate the user interface"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
form.weight = self.widget(QtGui.QLineEdit, "Weight")
|
||||
self.form = form
|
||||
if self.initValues():
|
||||
return True
|
||||
self.retranslateUi()
|
||||
|
||||
def getMainWindow(self):
|
||||
toplevel = QtGui.qApp.topLevelWidgets()
|
||||
for i in toplevel:
|
||||
if i.metaObject().className() == "Gui::MainWindow":
|
||||
return i
|
||||
raise Exception("No main window found")
|
||||
|
||||
def widget(self, class_id, name):
|
||||
"""Return the selected widget.
|
||||
|
||||
Keyword arguments:
|
||||
class_id -- Class identifier
|
||||
name -- Name of the widget
|
||||
"""
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
return form.findChild(class_id, name)
|
||||
|
||||
def initValues(self):
|
||||
"""Setup the initial values"""
|
||||
# Ensure that there are at least one valid object to generate the
|
||||
# weight
|
||||
selObjs = Gui.Selection.getSelection()
|
||||
self.shapes = []
|
||||
if not selObjs:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Weight objects can only be created on top of its geometry"
|
||||
" (no objects selected)",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
for obj in selObjs:
|
||||
try:
|
||||
self.shapes.append(obj.Shape)
|
||||
except:
|
||||
continue
|
||||
if not len(self.shapes):
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"No geometrical shapes found in the selected objects",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
|
||||
# Get the element type
|
||||
# 0 = unknow, 1 = vertex, 2 = line, 3 = face, 4 = solids
|
||||
self.elem_type = 0
|
||||
for shape in self.shapes:
|
||||
# Doing it in this way we are protected under strange entities,
|
||||
# and we are prepared to add higher level type of entities in the
|
||||
# future, just in case...
|
||||
try:
|
||||
if len(shape.Solids):
|
||||
self.elem_type = max(4, self.elem_type)
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
if len(shape.Faces):
|
||||
self.elem_type = max(3, self.elem_type)
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
if len(shape.Edges):
|
||||
self.elem_type = max(2, self.elem_type)
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
if len(shape.Vertexes):
|
||||
self.elem_type = max(1, self.elem_type)
|
||||
except:
|
||||
pass
|
||||
# Could it happens???
|
||||
if self.elem_type == 0:
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Unknow object shapes selected",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
|
||||
# Ensure as well that exist at least one valid ship to create the
|
||||
# entity inside it
|
||||
self.ships = []
|
||||
for obj in App.ActiveDocument.Objects:
|
||||
try:
|
||||
if obj.IsShip:
|
||||
self.ships.append(obj)
|
||||
except:
|
||||
continue
|
||||
if not len(self.ships):
|
||||
msg = QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"There are not ship objects to create weights into them",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8)
|
||||
App.Console.PrintError(msg + '\n')
|
||||
return True
|
||||
|
||||
# Fill the ships combo box
|
||||
mw = self.getMainWindow()
|
||||
form = mw.findChild(QtGui.QWidget, "TaskPanel")
|
||||
form.ship = self.widget(QtGui.QComboBox, "Ship")
|
||||
form.weight = self.widget(QtGui.QLineEdit, "Weight")
|
||||
icon = QtGui.QIcon(QtGui.QPixmap(":/icons/Ship_Instance.svg"))
|
||||
form.ship.clear()
|
||||
for ship in self.ships:
|
||||
form.ship.addItem(icon, ship.Label)
|
||||
form.ship.setCurrentIndex(0)
|
||||
|
||||
# Initialize the 0 mass/density string field
|
||||
m_unit = USys.getMassUnits()
|
||||
l_unit = USys.getLengthUnits()
|
||||
if self.elem_type == 1:
|
||||
w_unit = m_unit
|
||||
elif self.elem_type == 2:
|
||||
w_unit = m_unit + '/' + l_unit
|
||||
elif self.elem_type == 3:
|
||||
w_unit = m_unit + '/' + l_unit + '^2'
|
||||
elif self.elem_type == 4:
|
||||
w_unit = m_unit + '/' + l_unit + '^3'
|
||||
form.weight.setText('0 ' + w_unit)
|
||||
return False
|
||||
|
||||
def retranslateUi(self):
|
||||
"""Set the user interface locale strings."""
|
||||
self.form.setWindowTitle(QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Create a new weight",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
self.widget(QtGui.QLabel, "ShipLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Ship",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
if self.elem_type == 1:
|
||||
self.widget(QtGui.QLabel, "WeightLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Mass",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
elif self.elem_type == 2:
|
||||
self.widget(QtGui.QLabel, "WeightLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Linear density",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
elif self.elem_type == 3:
|
||||
self.widget(QtGui.QLabel, "WeightLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Area density",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
elif self.elem_type == 4:
|
||||
self.widget(QtGui.QLabel, "WeightLabel").setText(
|
||||
QtGui.QApplication.translate(
|
||||
"ship_weight",
|
||||
"Density",
|
||||
None,
|
||||
QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
|
||||
def createTask():
|
||||
panel = TaskPanel()
|
||||
Gui.Control.showDialog(panel)
|
||||
if panel.setupUi():
|
||||
Gui.Control.closeDialog(panel)
|
||||
return None
|
||||
return panel
|
97
src/Mod/Ship/shipCreateWeight/TaskPanel.ui
Normal file
97
src/Mod/Ship/shipCreateWeight/TaskPanel.ui
Normal file
|
@ -0,0 +1,97 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TaskPanel</class>
|
||||
<widget class="QWidget" name="TaskPanel">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>260</width>
|
||||
<height>78</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Create new weight</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="2" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="WeightLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Weight</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::InputField" name="Weight">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="ShipLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ship</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="Ship">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>1</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Gui::InputField</class>
|
||||
<extends>QLineEdit</extends>
|
||||
<header location="global">Gui/Inputfield.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
29
src/Mod/Ship/shipCreateWeight/__init__.py
Normal file
29
src/Mod/Ship/shipCreateWeight/__init__.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import TaskPanel
|
||||
|
||||
|
||||
def load():
|
||||
"""Loads the tool in the task panel"""
|
||||
TaskPanel.createTask()
|
|
@ -304,14 +304,10 @@ class Plot(object):
|
|||
@return True if error happens.
|
||||
"""
|
||||
# Create the spreadsheet
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Spreadsheet")
|
||||
s = Spreadsheet.Spreadsheet(obj)
|
||||
if FreeCAD.GuiUp:
|
||||
Spreadsheet.ViewProviderSpreadsheet(obj.ViewObject)
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
obj = Spreadsheet.makeSpreadsheet()
|
||||
s = obj.Proxy
|
||||
obj.Label = 'Hydrostatics'
|
||||
|
||||
|
||||
# Print the header
|
||||
s.a1 = "displacement [ton]"
|
||||
s.b1 = "draft [m]"
|
||||
|
|
|
@ -33,6 +33,7 @@ import PlotAux
|
|||
import Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Units as USys
|
||||
import shipUtils.Locale as Locale
|
||||
import Tools
|
||||
|
||||
|
||||
|
@ -239,28 +240,28 @@ class TaskPanel:
|
|||
|
||||
try:
|
||||
props.index("HydrostaticsTrim")
|
||||
form.trim.setText(angle_format.format(
|
||||
form.trim.setText(Locale.toString(angle_format.format(
|
||||
self.ship.HydrostaticsTrim.getValueAs(
|
||||
USys.getLengthUnits()).Value))
|
||||
USys.getLengthUnits()).Value)))
|
||||
except ValueError:
|
||||
form.trim.setText(angle_format.format(0.0))
|
||||
form.trim.setText(Locale.toString(angle_format.format(0.0)))
|
||||
|
||||
try:
|
||||
props.index("HydrostaticsMinDraft")
|
||||
form.minDraft.setText(length_format.format(
|
||||
form.minDraft.setText(Locale.toString(length_format.format(
|
||||
self.ship.HydrostaticsMinDraft.getValueAs(
|
||||
USys.getLengthUnits()).Value))
|
||||
USys.getLengthUnits()).Value)))
|
||||
except ValueError:
|
||||
form.minDraft.setText(length_format.format(
|
||||
0.9 * self.ship.Draft.getValueAs('m').Value))
|
||||
form.minDraft.setText(Locale.toString(length_format.format(
|
||||
0.9 * self.ship.Draft.getValueAs('m').Value)))
|
||||
try:
|
||||
props.index("HydrostaticsMaxDraft")
|
||||
form.maxDraft.setText(length_format.format(
|
||||
form.maxDraft.setText(Locale.toString(length_format.format(
|
||||
self.ship.HydrostaticsMaxDraft.getValueAs(
|
||||
USys.getLengthUnits()).Value))
|
||||
USys.getLengthUnits()).Value)))
|
||||
except ValueError:
|
||||
form.maxDraft.setText(length_format.format(
|
||||
1.1 * self.ship.Draft.getValueAs('m').Value))
|
||||
form.maxDraft.setText(Locale.toString(length_format.format(
|
||||
1.1 * self.ship.Draft.getValueAs('m').Value)))
|
||||
|
||||
try:
|
||||
props.index("HydrostaticsNDraft")
|
||||
|
@ -311,8 +312,8 @@ class TaskPanel:
|
|||
input_format = USys.getLengthFormat()
|
||||
val = min(val_max, max(val_min, val))
|
||||
qty = Units.Quantity('{} m'.format(val))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
return val
|
||||
|
||||
def clampAngle(self, widget, val_min, val_max, val):
|
||||
|
@ -321,8 +322,8 @@ class TaskPanel:
|
|||
input_format = USys.getAngleFormat()
|
||||
val = min(val_max, max(val_min, val))
|
||||
qty = Units.Quantity('{} deg'.format(val))
|
||||
widget.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
widget.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
return val
|
||||
|
||||
def onData(self, value):
|
||||
|
@ -344,8 +345,8 @@ class TaskPanel:
|
|||
trim = 0.0
|
||||
input_format = USys.getAngleFormat()
|
||||
qty = Units.Quantity('{} deg'.format(trim))
|
||||
form.trim.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.trim.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
try:
|
||||
min_draft = Units.Quantity(
|
||||
form.minDraft.text()).getValueAs('m').Value
|
||||
|
@ -353,8 +354,8 @@ class TaskPanel:
|
|||
min_draft = 0.9 * self.ship.Draft.getValueAs('m').Value
|
||||
input_format = USys.getLengthFormat()
|
||||
qty = Units.Quantity('{} m'.format(min_draft))
|
||||
form.minDraft.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.minDraft.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
try:
|
||||
max_draft = Units.Quantity(
|
||||
form.minDraft.text()).getValueAs('m').Value
|
||||
|
@ -362,8 +363,8 @@ class TaskPanel:
|
|||
max_draft = 0.9 * self.ship.Draft.getValueAs('m').Value
|
||||
input_format = USys.getLengthFormat()
|
||||
qty = Units.Quantity('{} m'.format(max_draft))
|
||||
form.maxDraft.setText(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value))
|
||||
form.maxDraft.setText(Locale.toString(input_format.format(
|
||||
qty.getValueAs(USys.getLengthUnits()).Value)))
|
||||
|
||||
# Clamp the values to the bounds
|
||||
bbox = self.ship.Shape.BoundBox
|
||||
|
|
|
@ -30,6 +30,7 @@ from PySide import QtGui, QtCore
|
|||
import Preview
|
||||
import Instance
|
||||
from shipUtils import Paths
|
||||
import shipUtils.Locale as Locale
|
||||
|
||||
|
||||
class TaskPanel:
|
||||
|
@ -365,7 +366,7 @@ class TaskPanel:
|
|||
number = 0.0
|
||||
|
||||
string = '{} m'.format(number)
|
||||
item.setText(string)
|
||||
item.setText(Locale.toString(string))
|
||||
# Regenerate the list
|
||||
del SectionList[:]
|
||||
for i in range(0, nRow):
|
||||
|
|
31
src/Mod/Ship/shipUtils/Locale.py
Normal file
31
src/Mod/Ship/shipUtils/Locale.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
from PySide import QtCore
|
||||
|
||||
|
||||
def toString(valueStr):
|
||||
"""Natural extension of QtCore.QLocale.toString method, in this case
|
||||
conveniently transforming a value string"""
|
||||
dec_sep = QtCore.QLocale.system().decimalPoint()
|
||||
return valueStr.replace(".", dec_sep)
|
|
@ -1,57 +1,57 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
def isAprox(a,b,tol=0.000001):
|
||||
"""returns if a value is into (b-tol,b+tol)
|
||||
@param a Value to compare.
|
||||
@param b Center of valid interval
|
||||
@param tol Radius of valid interval
|
||||
@return True if a is into (b-tol,b+tol), False otherwise
|
||||
"""
|
||||
if (a < b+abs(tol)) and (a > b-abs(tol)):
|
||||
return True
|
||||
return False
|
||||
"""returns if a value is into (b-tol,b+tol)
|
||||
@param a Value to compare.
|
||||
@param b Center of valid interval
|
||||
@param tol Radius of valid interval
|
||||
@return True if a is into (b-tol,b+tol), False otherwise
|
||||
"""
|
||||
if (a < b+abs(tol)) and (a > b-abs(tol)):
|
||||
return True
|
||||
return False
|
||||
|
||||
def isSamePoint(a,b,tol=0.000001):
|
||||
"""returns if two points are the same with a provided tolerance
|
||||
@param a Point to compare.
|
||||
@param b Reference point.
|
||||
@param tol Radius of valid interval
|
||||
@return True if twice point are the same, False otherwise
|
||||
@note FreeCAD::Base::Vector types must be provided
|
||||
"""
|
||||
if isAprox(a.x,b.x,tol) and isAprox(a.y,b.y,tol) and isAprox(a.z,b.z,tol):
|
||||
return True
|
||||
return False
|
||||
"""returns if two points are the same with a provided tolerance
|
||||
@param a Point to compare.
|
||||
@param b Reference point.
|
||||
@param tol Radius of valid interval
|
||||
@return True if twice point are the same, False otherwise
|
||||
@note FreeCAD::Base::Vector types must be provided
|
||||
"""
|
||||
if isAprox(a.x,b.x,tol) and isAprox(a.y,b.y,tol) and isAprox(a.z,b.z,tol):
|
||||
return True
|
||||
return False
|
||||
|
||||
def isSameVertex(a,b,tol=0.0001):
|
||||
"""returns if two points are the same with a provided tolerance
|
||||
@param a Point to compare.
|
||||
@param b Reference point.
|
||||
@param tol Radius of valid interval
|
||||
@return True if twice point are the same, False otherwise
|
||||
@note FreeCAD::Part::Vertex types must be provided
|
||||
"""
|
||||
if isAprox(a.X,b.X,tol) and isAprox(a.Y,b.Y,tol) and isAprox(a.Z,b.Z,tol):
|
||||
return True
|
||||
return False
|
||||
"""returns if two points are the same with a provided tolerance
|
||||
@param a Point to compare.
|
||||
@param b Reference point.
|
||||
@param tol Radius of valid interval
|
||||
@return True if twice point are the same, False otherwise
|
||||
@note FreeCAD::Part::Vertex types must be provided
|
||||
"""
|
||||
if isAprox(a.X,b.X,tol) and isAprox(a.Y,b.Y,tol) and isAprox(a.Z,b.Z,tol):
|
||||
return True
|
||||
return False
|
||||
|
|
|
@ -1,55 +1,55 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, FreeCADGui, os
|
||||
|
||||
def modulePath():
|
||||
"""returns the current Ship design module path
|
||||
@return Module path"""
|
||||
path1 = FreeCAD.ConfigGet("AppHomePath") + "Mod/Ship"
|
||||
path2 = FreeCAD.ConfigGet("UserAppData") + "Mod/Ship"
|
||||
if os.path.exists(path2):
|
||||
return path2
|
||||
else:
|
||||
return path1
|
||||
"""returns the current Ship design module path
|
||||
@return Module path"""
|
||||
path1 = FreeCAD.ConfigGet("AppHomePath") + "Mod/Ship"
|
||||
path2 = FreeCAD.ConfigGet("UserAppData") + "Mod/Ship"
|
||||
if os.path.exists(path2):
|
||||
return path2
|
||||
else:
|
||||
return path1
|
||||
|
||||
def iconsPath():
|
||||
"""returns the current Ship design module icons path
|
||||
@return Icons path"""
|
||||
path = modulePath() + "/Resources/icons"
|
||||
return path
|
||||
"""returns the current Ship design module icons path
|
||||
@return Icons path"""
|
||||
path = modulePath() + "/Resources/icons"
|
||||
return path
|
||||
|
||||
def getPathFromFile(fileName):
|
||||
""" Gets the directory path from a file name
|
||||
@param fileName Name of the file
|
||||
@return Directory path.
|
||||
"""
|
||||
if not fileName:
|
||||
return ''
|
||||
i = 1
|
||||
try:
|
||||
while 1:
|
||||
i = fileName.index("/", i+1)
|
||||
except ValueError:
|
||||
pass
|
||||
return fileName[0:i+1]
|
||||
""" Gets the directory path from a file name
|
||||
@param fileName Name of the file
|
||||
@return Directory path.
|
||||
"""
|
||||
if not fileName:
|
||||
return ''
|
||||
i = 1
|
||||
try:
|
||||
while 1:
|
||||
i = fileName.index("/", i+1)
|
||||
except ValueError:
|
||||
pass
|
||||
return fileName[0:i+1]
|
||||
|
|
|
@ -1,24 +1,24 @@
|
|||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* *
|
||||
#* Copyright (c) 2011, 2012 *
|
||||
#* Jose Luis Cercos Pita <jlcercos@gmail.com> *
|
||||
#* *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 *
|
||||
#* 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. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD
|
||||
|
|
|
@ -39,11 +39,6 @@
|
|||
<File Id="ShipExampleWigleyKatamaran" Name="wigley_katamaran.fcstd" />
|
||||
</Component>
|
||||
</Directory>
|
||||
<Directory Id="ModShipIcons" Name="icons" FileSource="../../Mod/Ship/resources/icons" >
|
||||
<Component Id="CompModShipIcons" Guid="ebdaaf8f-b975-4097-9ef8-4ed51ce24adf" Win64='$(var.Win_64)' KeyPath="yes">
|
||||
<File Id="ShipIcons01" Name="Ico.xpm" />
|
||||
</Component>
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Directory Id="ModshipAreasCurve" Name="shipAreasCurve" FileSource="../../Mod/Ship/shipAreasCurve" >
|
||||
<Component Id="CompModshipAreasCurve" Guid="49b32e4c-d861-4968-9c5c-8191ce6fa6c4" Win64='$(var.Win_64)' KeyPath="yes">
|
||||
|
|
Loading…
Reference in New Issue
Block a user