Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Este foro es para preguntas y debates en Español
Forum rules
reglas del foro e información útil

IMPORTANTE: Por favor leer antes de solicitar ayuda
disenator
Posts: 68
Joined: Thu Oct 16, 2014 11:24 pm

Re: Dudas sobre python (mostrar info en consola)

Post by disenator »

La herramienta ya tiene una pinta muy buena se podría usar para hacer tuberías y conductos.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Dudas sobre python (mostrar info en consola)

Post by Joyas »

Aquí dejo la última revisión, recordad la licencia y la cabecera, añado más detalles luego pero ya funcionan algunas curvas no circulares.

Code: Select all

###########################################################################################
# Prueba alambrizar
###########################################################################################

#def smWireEdge(extLength = 10.0, selFaceNames = '', selObjectName = ''):
def smWireEdge(RadiusWire = 0.5, RoundingCorners = 0, selFaceName = '', MainObject = None):

  aTrsf=Base.Matrix()
  finalShape = Part.makeSphere(RadiusWire)
  #esfera = Part.makeSphere(RadiusWire)
  #finalShape = finalShape.fuse( esfera )
  #placement =  Base.Vector(0,0,RadiusWire/2.0)   derivative1At
  VertexesNames = []
  VertexesConnections = []
  VertexesOrientations = []
  AllVertexes = MainObject.Shape.Vertexes
  for SingleVertex in AllVertexes:
    VertexesNames.append(str(SingleVertex.Point))
    VertexesConnections.append(0)

  AllEdges = MainObject.Shape.Edges
  AllEdgesLen = len(AllEdges)
  if(AllEdgesLen == 1):
    FreeCAD.Console.PrintError("Trazo único\n" )
  for SingleEdge in AllEdges:
    SingleEdgeLength = SingleEdge.Length
    SingleEdgePlacement_F = SingleEdge.valueAt(SingleEdge.FirstParameter)
    SingleEdgePlacement_L = SingleEdge.valueAt(SingleEdge.LastParameter)
    SingleEdgePlacement = SingleEdgePlacement_F
    SingleEdgeRotation = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_F = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_L = SingleEdge.tangentAt(SingleEdge.LastParameter)

    SingleEdgeDir_000 = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeDir_100 = SingleEdge.tangentAt(SingleEdge.LastParameter)
    #SingleEdgeDeriv_000 = SingleEdge.derivative1At(SingleEdge.FirstParameter)
    #SingleEdgeDeriv_100 = SingleEdge.derivative1At(SingleEdge.LastParameter)
    # Si las direcciones son iguales se presupone que el borde es una línea recta.
    # if the directions are the same, It is supossed that the edge is a rect.
    if (SingleEdgeDir_000 == SingleEdgeDir_100) and (AllEdgesLen > 1) :
      FreeCAD.Console.PrintError("Recta\n" )
      finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, SingleEdgeLength, SingleEdgePlacement_F, SingleEdgeRotation_F )  )
    else :
      CurvatureCenter_000 = SingleEdge.centerOfCurvatureAt(SingleEdge.FirstParameter)
      try:
        CurvatureCenter_050 = SingleEdge.centerOfCurvatureAt(SingleEdgeLength/2)
      except:
        CurvatureCenter_050 = 0
      CurvatureCenter_100 = SingleEdge.centerOfCurvatureAt(SingleEdge.LastParameter)
      if (CurvatureCenter_000 == CurvatureCenter_050) and (CurvatureCenter_050 == CurvatureCenter_100) :
        CurvatureRadius_050 = SingleEdge.curvatureAt(SingleEdgeLength/2)
        RadiusTorus = SingleEdgePlacement_F.sub(CurvatureCenter_000)
        AxisTorus = SingleEdgeDir_100.cross(SingleEdgeDir_000)
        Eje1 = SingleEdgePlacement_F.sub(CurvatureCenter_000)
        Eje2 = SingleEdgePlacement_L.sub(CurvatureCenter_000)
        Angle2Torus = math.degrees(Eje1.getAngle(Eje2) )
        AddTorus = Part.makeTorus(RadiusTorus.Length, RadiusWire, CurvatureCenter_050, AxisTorus, 0, 360, Angle2Torus  )
        FreeCAD.Console.PrintError("--\n\n" + str(AxisTorus) + "\n")
        InterestingTorusVert = AddTorus.Vertexes[0].Point
        Angle1Torus_F_Tvert0 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        Angle1Torus_L_Tvert0 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert0) + " " + str(Angle1Torus_L_Tvert0) + "  _  " )
        InterestingTorusVert = AddTorus.Vertexes[1].Point
        Angle1Torus_F_Tvert1 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        Angle1Torus_L_Tvert1 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert1) + " " + str(Angle1Torus_L_Tvert1) + "  _  " )
        Angle1Torus_Aprueba = Eje1.add( InterestingTorusVert.sub(CurvatureCenter_000) )
        ##Angle1Torus_Bprueba = Eje2.add( InterestingTorusVert.sub(CurvatureCenter_000) )
        #FreeCAD.Console.PrintError("-- " + str(Angle1Torus_Aprueba.Length) + " " + str(Angle1Torus_Bprueba.Length) + "\n" )
        InterestingTorusVert = AddTorus.Vertexes[0].Point
        #AngleTorus = InterestingTorusVert.sub(CurvatureCenter_050)
        Angle1Torus = math.degrees(RadiusTorus.getAngle( InterestingTorusVert.sub(CurvatureCenter_050)  ) )
        TestingTorus = RadiusTorus.cross( InterestingTorusVert.sub(CurvatureCenter_050)  )
        if(Angle1Torus_L_Tvert0 > Angle1Torus_F_Tvert1) :
          Angle1Torus *= (-1)
          AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
        else :
          AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
        FreeCAD.Console.PrintError("Curva circular " + str(Angle1Torus) + " " + str(Angle2Torus) + " " + str(CurvatureCenter_050) + " " + str(TestingTorus) + " " + str(AddTorus.Vertexes[0].Point) + "\n" )
        finalShape = finalShape.fuse( AddTorus  )
      else :
        #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_F, SingleEdgeRotation )  )
        #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_L, SingleEdgeRotation )  )
        CircleProfile_1 = Part.makeCircle(RadiusWire, SingleEdgePlacement_F, SingleEdgeRotation_F)
        CircleProfile_2 = Part.makeCircle(RadiusWire, SingleEdgePlacement_L, SingleEdgeRotation_L)
        CircleProfile_1 = Part.Wire(CircleProfile_1)
        CircleProfile_2 = Part.Wire(CircleProfile_2)
        #CircleProfile = Part.Face(CircleProfile_1B)
        WEdge = Part.Wire(SingleEdge)
        FreeCAD.Console.PrintError("- " + str(type(WEdge)) + " " + str(type(CircleProfile_1)) + " " + str(type(CircleProfile_2)) + "\n" )
        #SweepEdge = Part.Wire(SingleEdge).makePipeShell([CircleProfile_1],True,False)
        SweepEdge = WEdge.makePipeShell([CircleProfile_1, CircleProfile_2],True,False)
        #SweepEdge = Part.makeSweepSurface(SingleEdge, CircleProfile)
        finalShape = finalShape.fuse( SweepEdge  )
        FreeCAD.Console.PrintError("Curva no circular\n" )
#        FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )
    # Contar los bordes que llegan a cada vértice, saltar si no hay redondeamiento
    # Count the edges whic reach to each vertex, jump if there aren't rounding
    if RoundingCorners == 1 :
      for n in range(len(AllVertexes)):
        #FreeCAD.Console.PrintError("Vértices 0 del borde " + str(n) + ":" + VertexesNames[n] + " = " + str(SingleEdge.Vertexes[0].Point ) + "\n" )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[0].Point):
          VertexesConnections[n] += 1
          #FreeCAD.Console.PrintError("Coincidencia encontrada" + str(n) )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[1].Point):
          VertexesConnections[n] += 1

  #Redondeamiento, saltar si el usuario no lo quiere
  #Rounding, skip if user doesn't want it
  if RoundingCorners >= 1 :
    contador = 0
    for SingleVertex in AllVertexes:
      if (VertexesConnections[contador] > 1) or (RoundingCorners >= 2):
        SingleVertexPlacement = SingleVertex.Point
        finalShape = finalShape.fuse( Part.makeSphere(RadiusWire, SingleVertexPlacement )  )
      contador += 1
#    for n in range(len(AllVertexes)):
#      FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )

  #finalShape = finalShape.removeSplitter()
  #finalShape = Part.Solid(finalShape.childShapes()[0])  
  Gui.ActiveDocument.getObject( MainObject.Name ).Visibility = False
  return finalShape


  
class SMWireEdge:
  def __init__(self, obj):
    '''"WireEdge" '''
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba init")
    selobj = Gui.Selection.getSelectionEx()[0]
    
    obj.addProperty("App::PropertyLength","Radius","Parameters","Radious of wires").Radius = 0.5
    obj.addProperty("App::PropertyInteger","Rounding","Parameters","Rounding of vertex (0 none, 1 only at ends, 2 always)").Rounding = 0
    obj.addProperty("App::PropertyLinkSub", "baseObject", "Parameters", "Base object").baseObject = (selobj.Object, selobj.SubElementNames)
    obj.Proxy = self

  def execute(self, fp):
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba execute (" + str(self) + ")(" + str(fp.baseObject[0]) + ")")
    FreeCAD.Console.PrintMessage("Hola")
    FreeCAD.Console.PrintError("Error")
    s = smWireEdge(RadiusWire = fp.Radius.Value, RoundingCorners = fp.Rounding, selFaceName = fp.baseObject[1], MainObject = fp.baseObject[0])
    fp.Shape = s
    

class SMWireEdgeCommandClass():
  """WireEdge"""

  def GetResources(self):
    return {'Pixmap'  : os.path.join( iconPath , 'SMWireEdge.svg') , # the name of a svg file available in the resources
            'MenuText': "Wire edges" ,
            'ToolTip' : "Wire edges of object"}
 
  def Activated(self):
    print "test"
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","WireEdge")
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba Activated" + str(a))
    SMWireEdge(a)
    SMViewProviderTree(a.ViewObject)
    FreeCAD.ActiveDocument.recompute()
    return
   
  def IsActive(self):


    if len(Gui.Selection.getSelection()) == 1:
      return True
    return False

Gui.addCommand('SMWireEdge',SMWireEdgeCommandClass())
Attachments
WireEdgeB.PNG
WireEdgeB.PNG (88.42 KiB) Viewed 1938 times
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
disenator
Posts: 68
Joined: Thu Oct 16, 2014 11:24 pm

Re: Dudas sobre python (mostrar info en consola)

Post by disenator »

¡¡¡¡MUCHAS GRACIAS!!!!
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Dudas sobre python (mostrar info en consola)

Post by Joyas »

¡A vosotros!

Otra utilidad que le veo es dibujar el cuadro de una bici hecho con tubos cilíndricos. Al ser paramétrico se podría editar luego.

Comentaré un poco lo próximo que tengo pensado añadir:
  • Algo para manejar figuras cerradas.
  • No meter esferas donde no sean necesarias. Esto tengo planeado hacerlo calculando en dada vértice si hay al menos dos bordes que tengan un ángulo de tangencia de 180ª, de esta forma no haría falta añadir esfera, ya que quedaría tapada totalmente y nos ahorraríamos una operación booleana potencialmente problemática.
  • En los vértices extremos, que sólo les llega un borde, dibujar media esfera, y orientarla para que coincida con la tangencia de ese borde, de esa forma se podría simplificar la fusión.
  • y por supuesto quitar la esfera pequeña de 0,0,0 y ver qué hacer con la herramienta, si existe algún banco de trabajo misceláneo.
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Dudas sobre python (mostrar info en consola)

Post by Joyas »

He añadido lo de poner media esfera en los extremos, ahora muchas líneas Bezier y esplínea se pueden poner con bordes redondeados.

No obstante hay figuras que por alguna razón no funcionan bien, aunque la herramienta ya cubre bastante variedad de figuras.

Hay que limpiar el código, eso si, y documentarlo un poco, además de ver lo que hago con él. ¿Alguna recomendación? Porque crear un banco de trabajo para una sola herramienta es un poco excesivo.

También hay que ver si se renombra la herramienta o si se cambia el nombre de los parámetros, también tema de traducciones...

Code: Select all

###########################################################################################
# Prueba alambrizar
###########################################################################################

#def smWireEdge(extLength = 10.0, selFaceNames = '', selObjectName = ''):
def smWireEdge(RadiusWire = 0.5, RoundingCorners = 0, selFaceName = '', MainObject = None):

  aTrsf=Base.Matrix()
  finalShape = Part.makeSphere(RadiusWire)
  #esfera = Part.makeSphere(RadiusWire)
  #finalShape = finalShape.fuse( esfera )
  #placement =  Base.Vector(0,0,RadiusWire/2.0)   derivative1At
  VertexesNames = []
  VertexesConnections = []
  VertexesDrawSphere = []
  VertexesTangents = []
  AllVertexes = MainObject.Shape.Vertexes
  for SingleVertex in AllVertexes:
    VertexesNames.append(str(SingleVertex.Point))
    VertexesConnections.append(0)
    VertexesDrawSphere.append(1)
    VertexesTangents.append([])

  AllEdges = MainObject.Shape.Edges
  AllEdgesLen = len(AllEdges)
  if(AllEdgesLen == 1):
    FreeCAD.Console.PrintError("Trazo único\n" )
  for SingleEdge in AllEdges:
    SingleEdgeLength = SingleEdge.Length
    SingleEdgePlacement_F = SingleEdge.valueAt(SingleEdge.FirstParameter)
    SingleEdgePlacement_L = SingleEdge.valueAt(SingleEdge.LastParameter)
    SingleEdgePlacement = SingleEdgePlacement_F
    SingleEdgeRotation = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_F = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_L = SingleEdge.tangentAt(SingleEdge.LastParameter)

    SingleEdgeDir_000 = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeDir_100 = SingleEdge.tangentAt(SingleEdge.LastParameter)
    #SingleEdgeDeriv_000 = SingleEdge.derivative1At(SingleEdge.FirstParameter)
    #SingleEdgeDeriv_100 = SingleEdge.derivative1At(SingleEdge.LastParameter)
    # Si las direcciones son iguales se presupone que el borde es una línea recta.
    # if the directions are the same, It is supossed that the edge is a rect.
    if (SingleEdgeDir_000 == SingleEdgeDir_100) and (AllEdgesLen > 1) :
      FreeCAD.Console.PrintError("Recta\n" )
      finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, SingleEdgeLength, SingleEdgePlacement_F, SingleEdgeRotation_F )  )
    else :
      CurvatureCenter_000 = SingleEdge.centerOfCurvatureAt(SingleEdge.FirstParameter)
      try:
        CurvatureCenter_050 = SingleEdge.centerOfCurvatureAt(SingleEdgeLength/2)
      except:
        CurvatureCenter_050 = 0
      CurvatureCenter_100 = SingleEdge.centerOfCurvatureAt(SingleEdge.LastParameter)
      if (CurvatureCenter_000 == CurvatureCenter_050) and (CurvatureCenter_050 == CurvatureCenter_100) :
        CurvatureRadius_050 = SingleEdge.curvatureAt(SingleEdgeLength/2)
        RadiusTorus = SingleEdgePlacement_F.sub(CurvatureCenter_000)
        AxisTorus = SingleEdgeDir_100.cross(SingleEdgeDir_000)
        Eje1 = SingleEdgePlacement_F.sub(CurvatureCenter_000)
        Eje2 = SingleEdgePlacement_L.sub(CurvatureCenter_000)
        Angle2Torus = math.degrees(Eje1.getAngle(Eje2) )
        AddTorus = Part.makeTorus(RadiusTorus.Length, RadiusWire, CurvatureCenter_050, AxisTorus, 0, 360, Angle2Torus  )
        FreeCAD.Console.PrintError("--\n\n" + str(AxisTorus) + "\n")
        InterestingTorusVert = AddTorus.Vertexes[0].Point
        Angle1Torus_F_Tvert0 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        Angle1Torus_L_Tvert0 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert0) + " " + str(Angle1Torus_L_Tvert0) + "  _  " )
        InterestingTorusVert = AddTorus.Vertexes[1].Point
        Angle1Torus_F_Tvert1 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        Angle1Torus_L_Tvert1 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
        FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert1) + " " + str(Angle1Torus_L_Tvert1) + "  _  " )
        Angle1Torus_Aprueba = Eje1.add( InterestingTorusVert.sub(CurvatureCenter_000) )
        ##Angle1Torus_Bprueba = Eje2.add( InterestingTorusVert.sub(CurvatureCenter_000) )
        #FreeCAD.Console.PrintError("-- " + str(Angle1Torus_Aprueba.Length) + " " + str(Angle1Torus_Bprueba.Length) + "\n" )
        InterestingTorusVert = AddTorus.Vertexes[0].Point
        #AngleTorus = InterestingTorusVert.sub(CurvatureCenter_050)
        Angle1Torus = math.degrees(RadiusTorus.getAngle( InterestingTorusVert.sub(CurvatureCenter_050)  ) )
        TestingTorus = RadiusTorus.cross( InterestingTorusVert.sub(CurvatureCenter_050)  )
        if(Angle1Torus_L_Tvert0 > Angle1Torus_F_Tvert1) :
          Angle1Torus *= (-1)
          AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
        else :
          AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
        FreeCAD.Console.PrintError("Curva circular " + str(Angle1Torus) + " " + str(Angle2Torus) + " " + str(CurvatureCenter_050) + " " + str(TestingTorus) + " " + str(AddTorus.Vertexes[0].Point) + "\n" )
        finalShape = finalShape.fuse( AddTorus  )
      else :
        #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_F, SingleEdgeRotation )  )
        #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_L, SingleEdgeRotation )  )
        CircleProfile_1 = Part.makeCircle(RadiusWire, SingleEdgePlacement_F, SingleEdgeRotation_F)
        CircleProfile_2 = Part.makeCircle(RadiusWire, SingleEdgePlacement_L, SingleEdgeRotation_L)
        CircleProfile_1 = Part.Wire(CircleProfile_1)
        CircleProfile_2 = Part.Wire(CircleProfile_2)
        #CircleProfile = Part.Face(CircleProfile_1B)
        WEdge = Part.Wire(SingleEdge)
        FreeCAD.Console.PrintError("- " + str(type(WEdge)) + " " + str(type(CircleProfile_1)) + " " + str(type(CircleProfile_2)) + "\n" )
        #SweepEdge = Part.Wire(SingleEdge).makePipeShell([CircleProfile_1],True,False)
        SweepEdge = WEdge.makePipeShell([CircleProfile_1, CircleProfile_2],True,False)
        #SweepEdge = Part.makeSweepSurface(SingleEdge, CircleProfile)
        finalShape = finalShape.fuse( SweepEdge  )
        FreeCAD.Console.PrintError("Curva no circular\n" )
#        FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )
    # Contar los bordes que llegan a cada vértice, saltar si no hay redondeamiento
    # Count the edges whic reach to each vertex, jump if there aren't rounding
    if RoundingCorners > 0 :
      for n in range(len(AllVertexes)):
        #FreeCAD.Console.PrintError("Vértices 0 del borde " + str(n) + ":" + VertexesNames[n] + " = " + str(SingleEdge.Vertexes[0].Point ) + "\n" )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[0].Point):
          VertexesConnections[n] += 1
          VertexesTangents[n].append(SingleEdgeRotation_F)
          #FreeCAD.Console.PrintError("Coincidencia encontrada" + str(n) )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[1].Point):
          VertexesConnections[n] += 1
          VertexesTangents[n].append(SingleEdgeRotation_L.multiply(-1))

  #Redondeamiento, saltar si el usuario no lo quiere
  #Rounding, skip if user doesn't want it
  if RoundingCorners >= 1 :
    FreeCAD.Console.PrintError("   No dibujar esfera " + str(RoundingCorners) + "\n")
    for l in range(len(VertexesTangents)):
      for m in range(len(VertexesTangents[l])):
        for n in range(m + 1, len(VertexesTangents[l])):
          FreeCAD.Console.PrintError("Tangente " + str(l) + " " + str(m) + " " + str(n) )
          AngleTangents = math.degrees((VertexesTangents[l][m]).getAngle(VertexesTangents[l][n]))
          FreeCAD.Console.PrintError(": " + str(VertexesTangents[l][m]) + " " + str(VertexesTangents[l][n]) + " " + str(AngleTangents) + "\n")
          if(     (AngleTangents > 179.9)   ):
            FreeCAD.Console.PrintError("   No dibujar esfera " + str(VertexesConnections[l]) + "\n")
            VertexesDrawSphere[l] = 0

    contador = 0
    for SingleVertex in AllVertexes:
      if (VertexesDrawSphere[contador] == 1):
        if (VertexesConnections[contador] > 1) or (RoundingCorners >= 2):
          if (VertexesConnections[contador] == 1) :
            SingleVertexPlacement = SingleVertex.Point
            finalShape = finalShape.fuse( Part.makeSphere(RadiusWire, SingleVertexPlacement, VertexesTangents[contador][0], -90, 0, 360 )  )
          else :
            SingleVertexPlacement = SingleVertex.Point
            finalShape = finalShape.fuse( Part.makeSphere(RadiusWire, SingleVertexPlacement )  )
      contador += 1
#    for n in range(len(AllVertexes)):
#      FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )

  #finalShape = finalShape.removeSplitter()
  #finalShape = Part.Solid(finalShape.childShapes()[0])  
  Gui.ActiveDocument.getObject( MainObject.Name ).Visibility = False
  return finalShape


  
class SMWireEdge:
  def __init__(self, obj):
    '''"WireEdge" '''
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba init")
    selobj = Gui.Selection.getSelectionEx()[0]
    
    obj.addProperty("App::PropertyLength","Radius","Parameters","Radious of wires").Radius = 0.5
    obj.addProperty("App::PropertyInteger","Rounding","Parameters","Rounding of vertex (0 none, 1 only at ends, 2 always)").Rounding = 0
    obj.addProperty("App::PropertyLinkSub", "baseObject", "Parameters", "Base object").baseObject = (selobj.Object, selobj.SubElementNames)
    obj.Proxy = self

  def execute(self, fp):
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba execute (" + str(self) + ")(" + str(fp.baseObject[0]) + ")")
    FreeCAD.Console.PrintMessage("Hola")
    FreeCAD.Console.PrintError("Error")
    s = smWireEdge(RadiusWire = fp.Radius.Value, RoundingCorners = fp.Rounding, selFaceName = fp.baseObject[1], MainObject = fp.baseObject[0])
    fp.Shape = s
    

class SMWireEdgeCommandClass():
  """WireEdge"""

  def GetResources(self):
    return {'Pixmap'  : os.path.join( iconPath , 'SMWireEdge.svg') , # the name of a svg file available in the resources
            'MenuText': "Wire edges" ,
            'ToolTip' : "Wire edges of object"}
 
  def Activated(self):
    print "test"
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","WireEdge")
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba Activated" + str(a))
    SMWireEdge(a)
    SMViewProviderTree(a.ViewObject)
    FreeCAD.ActiveDocument.recompute()
    return
   
  def IsActive(self):


    if len(Gui.Selection.getSelection()) == 1:
      return True
    return False

Gui.addCommand('SMWireEdge',SMWireEdgeCommandClass())
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Post by Joyas »

Estoy trasteando con el módulo Info, y tengo esto:

Code: Select all

{'RadiusOfGyration': (3.0550504633038953, 3.0550504633038917, 1.4142135623730985), 'FirstAxisOfInertia': Vector (0.9999180666642095, -0.011085800326640026, -0.0064003898027679825), 'ThirdAxisOfInertia': Vector (-7.150925057421555e-17, -0.5000000000000003, 0.8660254037844385), 'Moments': (1172.861257340191, 1172.861257340188, 251.32741228718467), 'SymmetryPoint': False, 'SecondAxisOfInertia': Vector (0.01280077960553608, 0.8659544474342271, 0.49995903333210506), 'SymmetryAxis': True}
El código se lee así, entrando en los índices mediante un número entero:

Code: Select all

			j = s.Solids[0].PrincipalProperties
			print j
			panel.form.P1axisvalue.setText(NiceNumberStr(j.values()[3][0], MaxReference))
			panel.form.P2axisvalue.setText(NiceNumberStr(j.values()[3][1], MaxReference))
			panel.form.P3axisvalue.setText(NiceNumberStr(j.values()[3][2], MaxReference))

			panel.form.PV1axisvalueX.setText(NiceNumberStr(j.values()[1].x, MaxReference))
			panel.form.PV1axisvalueY.setText(NiceNumberStr(j.values()[1].y, MaxReference))
			panel.form.PV1axisvalueZ.setText(NiceNumberStr(j.values()[1].z, MaxReference))
			panel.form.PV2axisvalueX.setText(NiceNumberStr(j.values()[5].x, MaxReference))
			panel.form.PV2axisvalueY.setText(NiceNumberStr(j.values()[5].y, MaxReference))
			panel.form.PV2axisvalueZ.setText(NiceNumberStr(j.values()[5].z, MaxReference))
			panel.form.PV3axisvalueX.setText(NiceNumberStr(j.values()[2].x, MaxReference))
			panel.form.PV3axisvalueY.setText(NiceNumberStr(j.values()[2].y, MaxReference))
			panel.form.PV3axisvalueZ.setText(NiceNumberStr(j.values()[2].z, MaxReference))

			panel.form.R1axisvalue.setText(NiceNumberStr(j.values()[0][0], MaxReference))
			panel.form.R2axisvalue.setText(NiceNumberStr(j.values()[0][1], MaxReference))
			panel.form.R3axisvalue.setText(NiceNumberStr(j.values()[0][2], MaxReference))
Sin embargo esos índices están "bautizados", por ejemplo, con "RadiusOfGyration" en vez de un 0 y "ThirdAxisOfInertia" en vez de un 2. ¿Alguien sabe cómo se podría acceder a esos índices a través del nombre en vez de usar un número? El motivo es que lo mismo en el futuro cambian el orden y el módulo queda obsoleto, mi idea es ponerlo por nombre para que sea más difícil que eso ocurra.
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Post by Joyas »

Una pregunta de cara a separar la función de "alambrizar" en un banco de trabajo nuevo misceláneo que tal vez bautice como "LOLCAD" (no es que tenga gracia, pero algo habrá que poner de nombre): ¿Merece la pena ponerlo en inglés y compartir el código en un servicio de código en línea? ¿O creéis que es mejor algo más sencillo y orientado hacia nosotros, subiendo el código sólo aquí y poniendo todo en español? ¿Creéis que tendría interés una función que distribuyera los objetos por una superficie esférica siguiendo los vértices de un icosaedro como la función matriz del módulo draft, pero eso, siguiendo una esfera? ¿Veríais interés en añadir un botón para hacer figuras primitivas tipo icosaedro o un prisma que en vez de rectángulos en las caras tenga triángulos donde estén salteados los vértices superiores y los inferiores? Podrían ser interesantes para gente interesada en diseño industrial, aunque no tengo ni idea de si no estoy exagerando mucho y no será una chorrada.
Attachments
Propuestas.PNG
Propuestas.PNG (122.79 KiB) Viewed 1892 times
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Post by Joyas »

Bueno, lo que he pensado hacer es esto:
  • Intentar rematar la función alambrizar.
  • Separarla en otro banco de trabajo llamado "LOLCAD", con icono "Awesomeface" creado por mi para que sea libre y programado en español y con nombres en español, ya que es algo que en principio no saldría mucho de este subforo.
  • Intentar crear la herramienta del icosaedro si veo una fórmula para sacar los vértices (tal vez me valga un código que ya existe, no lo se).
  • Mirar si se pueden hacer primitivas desde cero y de ahí sacar lo del prisma raro ese que comenté antes.
  • Matriz de texto cambiante. Esto sería para hacer listas de números o letras donde se incremente en una unidad (o siguiente letra) cada posción (un reloj, un ascensor antiguo..).
  • Ah, y quitar la esfera pequeña esa del principio, tendré que cotillear el código de la función matriz, a ver si es posible descubrir algo ahí.
Si alguno le pica la curiosidad, os dejo el módulo info retocado por mi, he añadido código para que si hay un eje de simetría y dos inercias son iguales los ángulos de esos ejes salgan en gris claro para indicar que son datos poco relevantes.
Attachments
Info.zip
(15.96 KiB) Downloaded 48 times
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Post by Joyas »

Bien, como con la herramienta de alambrizar estoy más o menos satisfecho (especialmente para lo que esperaba al principio), voy a empezar a separar el código en un banco de trabajo nuevo llamado "Parts with new enhanced details" o "Piezas con nuevo detalle realzado", LOLCAD ya estaba tomado:

http://diyhpl.us/cgit/lolcad
https://groups.google.com/forum/#!topic ... g20fUczN0Y

Los rótulos, si veo la forma de traducirlos, los pondría en inglés y con traducción al español, sino en español de forma directa.
Ahora intentaré hacer lo de la matriz icosaédrica, a ver que tal sale.

Si estoy siendo muy pesado avisadme, por favor.

Code: Select all

###########################################################################################
# Prueba alambrizar
###########################################################################################




#def smWireEdge(extLength = 10.0, selFaceNames = '', selObjectName = ''):
def smWireEdge(RadiusWire = 0.5, RoundingCorners = 0, selFaceName = '', MainObject = None):

  aTrsf=Base.Matrix()
  ball1 = Part.makeSphere(1)
  ball2 = Part.makeSphere(2)
  #ballB = [ball.copy()]
  #finalShape = ballB.pop()
  finalShape = ball1.cut(ball2)
  #finalShape = Part.makeSphere(RadiusWire)
  #esfera = Part.makeSphere(RadiusWire)
  #finalShape = finalShape.fuse( esfera )
  #placement =  Base.Vector(0,0,RadiusWire/2.0)   derivative1At
  VertexesNames = []
  VertexesConnections = []
  VertexesDrawSphere = []
  VertexesTangents = []
  AllVertexes = MainObject.Shape.Vertexes
  for SingleVertex in AllVertexes:
    VertexesNames.append(str(SingleVertex.Point))
    VertexesConnections.append(0)
    VertexesDrawSphere.append(1)
    VertexesTangents.append([])

  AllEdges = MainObject.Shape.Edges
  AllEdgesLen = len(AllEdges)
  if(AllEdgesLen == 1):
    FreeCAD.Console.PrintError("Trazo único\n" )
  for SingleEdge in AllEdges:
    SingleEdgeLength = SingleEdge.Length
    SingleEdgePlacement_F = SingleEdge.valueAt(SingleEdge.FirstParameter)
    SingleEdgePlacement_L = SingleEdge.valueAt(SingleEdge.LastParameter)
    SingleEdgePlacement = SingleEdgePlacement_F
    SingleEdgeRotation = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_F = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeRotation_L = SingleEdge.tangentAt(SingleEdge.LastParameter)
    try:
      SingleEdgePlacement_050 = SingleEdge.valueAt(SingleEdgeLength/2)
    except:
      SingleEdgePlacement_050 = Base.Vector(0,0,0)

    SingleEdgeDir_000 = SingleEdge.tangentAt(SingleEdge.FirstParameter)
    SingleEdgeDir_100 = SingleEdge.tangentAt(SingleEdge.LastParameter)
    #SingleEdgeDeriv_000 = SingleEdge.derivative1At(SingleEdge.FirstParameter)
    #SingleEdgeDeriv_100 = SingleEdge.derivative1At(SingleEdge.LastParameter)
    # Si las direcciones son iguales se presupone que el borde es una línea recta.
    # if the directions are the same, It is supossed that the edge is a rect.
    #if (SingleEdgeDir_000 == SingleEdgeDir_100) and (middlepoint(SingleEdgePlacement_F, SingleEdgePlacement_L, SingleEdgePlacement_050) == 1): # 
    #

    if (SingleEdgePlacement_F == SingleEdgePlacement_L):
      FreeCAD.Console.PrintError("Curva cerrada\n" )
      CircleProfile_1 = Part.makeCircle(RadiusWire, SingleEdgePlacement_F, SingleEdgeRotation_F)
      #CircleProfile_2 = Part.makeCircle(RadiusWire, SingleEdgePlacement_L, SingleEdgeRotation_L)
      CircleProfile_1 = Part.Wire(CircleProfile_1)
      #CircleProfile_2 = Part.Wire(CircleProfile_2)
      WEdge = Part.Wire(SingleEdge)
      FreeCAD.Console.PrintError("- " + str(type(WEdge)) + " " + str(type(CircleProfile_1)) + "\n" )
      SweepEdge = WEdge.makePipeShell([CircleProfile_1],True,False)
      finalShape = finalShape.fuse( SweepEdge  )
    else :
      FreeCAD.Console.PrintError("Línea abierta\n" )
      if (SingleEdgeDir_000 == SingleEdgeDir_100) and (SingleEdge.curvatureAt(SingleEdge.LastParameter) == 0):
        FreeCAD.Console.PrintError("Recta\n" )
        finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, SingleEdgeLength, SingleEdgePlacement_F, SingleEdgeRotation_F )  )
      else:
        FreeCAD.Console.PrintError("Prueba __CurvatureCenter_000__ " + str(0) + "\n" )
        CurvatureCenter_000 = SingleEdge.centerOfCurvatureAt(SingleEdge.FirstParameter)
        CurvatureCenter_100 = SingleEdge.centerOfCurvatureAt(SingleEdge.LastParameter)
        FreeCAD.Console.PrintError("Prueba __CurvatureCenter_100__ " + str(CurvatureCenter_000) + "\n" )
        try:
          CurvatureCenter_050 = SingleEdge.centerOfCurvatureAt(SingleEdgeLength/2)
        except:
          CurvatureCenter_050 = 0
        FreeCAD.Console.PrintError("Prueba __CurvatureCenter_050__ " + str(CurvatureCenter_050) + "\n" )
        if (CurvatureCenter_000 == CurvatureCenter_050) and (CurvatureCenter_050 == CurvatureCenter_100) :
          CurvatureRadius_050 = SingleEdge.curvatureAt(SingleEdgeLength/2)
          RadiusTorus = SingleEdgePlacement_F.sub(CurvatureCenter_000)
          AxisTorus = SingleEdgeDir_100.cross(SingleEdgeDir_000)
          Eje1 = SingleEdgePlacement_F.sub(CurvatureCenter_000)
          Eje2 = SingleEdgePlacement_L.sub(CurvatureCenter_000)
          Angle2Torus = math.degrees(Eje1.getAngle(Eje2) )
          AddTorus = Part.makeTorus(RadiusTorus.Length, RadiusWire, CurvatureCenter_050, AxisTorus, 0, 360, Angle2Torus  )
          FreeCAD.Console.PrintError("--\n\n" + str(AxisTorus) + "\n")
          InterestingTorusVert = AddTorus.Vertexes[0].Point
          Angle1Torus_F_Tvert0 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
          Angle1Torus_L_Tvert0 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
          FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert0) + " " + str(Angle1Torus_L_Tvert0) + "  _  " )
          InterestingTorusVert = AddTorus.Vertexes[1].Point
          Angle1Torus_F_Tvert1 = math.degrees(Eje1.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
          Angle1Torus_L_Tvert1 = math.degrees(Eje2.getAngle( InterestingTorusVert.sub(CurvatureCenter_000)  ) )
          FreeCAD.Console.PrintError("-- " + str(Angle1Torus_F_Tvert1) + " " + str(Angle1Torus_L_Tvert1) + "  _  " )
          Angle1Torus_Aprueba = Eje1.add( InterestingTorusVert.sub(CurvatureCenter_000) )
          ##Angle1Torus_Bprueba = Eje2.add( InterestingTorusVert.sub(CurvatureCenter_000) )
          #FreeCAD.Console.PrintError("-- " + str(Angle1Torus_Aprueba.Length) + " " + str(Angle1Torus_Bprueba.Length) + "\n" )
          InterestingTorusVert = AddTorus.Vertexes[0].Point
          #AngleTorus = InterestingTorusVert.sub(CurvatureCenter_050)
          Angle1Torus = math.degrees(RadiusTorus.getAngle( InterestingTorusVert.sub(CurvatureCenter_050)  ) )
          TestingTorus = RadiusTorus.cross( InterestingTorusVert.sub(CurvatureCenter_050)  )
          if(Angle1Torus_L_Tvert0 > Angle1Torus_F_Tvert1) :
            Angle1Torus *= (-1)
            AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
          else :
            AddTorus.rotate(CurvatureCenter_050, AxisTorus, Angle1Torus)
          FreeCAD.Console.PrintError("Curva circular " + str(Angle1Torus) + " " + str(Angle2Torus) + " " + str(CurvatureCenter_050) + " " + str(TestingTorus) + " " + str(AddTorus.Vertexes[0].Point) + "\n" )
          finalShape = finalShape.fuse( AddTorus  )
        else :
          FreeCAD.Console.PrintError("Curva no circular\n" )
          #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_F, SingleEdgeRotation )  )
          #finalShape = finalShape.fuse( Part.makeCylinder(RadiusWire, 0.5, SingleEdgePlacement_L, SingleEdgeRotation )  )
          CircleProfile_1 = Part.makeCircle(RadiusWire, SingleEdgePlacement_F, SingleEdgeRotation_F)
          CircleProfile_2 = Part.makeCircle(RadiusWire, SingleEdgePlacement_L, SingleEdgeRotation_L)
          CircleProfile_1 = Part.Wire(CircleProfile_1)
          CircleProfile_2 = Part.Wire(CircleProfile_2)
          #CircleProfile = Part.Face(CircleProfile_1B)
          WEdge = Part.Wire(SingleEdge)
          FreeCAD.Console.PrintError("- " + str(type(WEdge)) + " " + str(type(CircleProfile_1)) + " " + str(type(CircleProfile_2)) + "\n" )
          FreeCAD.Console.PrintError("- " + str(SingleEdgeRotation_F) + " " + str(SingleEdgeRotation_L) + " " + str(SingleEdgePlacement_F) + " " + str(SingleEdgePlacement_L) + "\n" )
          #SweepEdge = Part.Wire(SingleEdge).makePipeShell([CircleProfile_1],True,False)
          try:
            SweepEdge = WEdge.makePipeShell([CircleProfile_1, CircleProfile_2],True,False)
          except:
            SweepEdge = WEdge.makePipeShell([CircleProfile_1],True,False)
          #SweepEdge = Part.makeSweepSurface(SingleEdge, CircleProfile)
          finalShape = finalShape.fuse( SweepEdge  )
  #        FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )


    #if (SingleEdgeDir_000 == SingleEdgeDir_100) and (curvatureAt(SingleEdge.LastParameter) == 0): # 
    #  if (SingleEdgePlacement_F != SingleEdgePlacement_L):
    #else :

    # Contar los bordes que llegan a cada vértice, saltar si no hay redondeamiento
    # Count the edges whic reach to each vertex, jump if there aren't rounding
    if RoundingCorners > 0 :
      for n in range(len(AllVertexes)):
        #FreeCAD.Console.PrintError("Vértices 0 del borde " + str(n) + ":" + VertexesNames[n] + " = " + str(SingleEdge.Vertexes[0].Point ) + "\n" )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[0].Point):
          VertexesConnections[n] += 1
          VertexesTangents[n].append(SingleEdgeRotation_F)
          #FreeCAD.Console.PrintError("Coincidencia encontrada" + str(n) )
        if str(VertexesNames[n]) == str(SingleEdge.Vertexes[1].Point):
          VertexesConnections[n] += 1
          VertexesTangents[n].append(SingleEdgeRotation_L.multiply(-1))

  #Redondeamiento, saltar si el usuario no lo quiere
  #Rounding, skip if user doesn't want it
  if RoundingCorners >= 1 :
    FreeCAD.Console.PrintError("   No dibujar esfera " + str(RoundingCorners) + "\n")
    for l in range(len(VertexesTangents)):
      for m in range(len(VertexesTangents[l])):
        for n in range(m + 1, len(VertexesTangents[l])):
          FreeCAD.Console.PrintError("Tangente " + str(l) + " " + str(m) + " " + str(n) )
          AngleTangents = math.degrees((VertexesTangents[l][m]).getAngle(VertexesTangents[l][n]))
          FreeCAD.Console.PrintError(": " + str(VertexesTangents[l][m]) + " " + str(VertexesTangents[l][n]) + " " + str(AngleTangents) + "\n")
          if(     (AngleTangents > 179.9)   ):
            FreeCAD.Console.PrintError("   No dibujar esfera " + str(VertexesConnections[l]) + "\n")
            VertexesDrawSphere[l] = 0

    contador = 0
    for SingleVertex in AllVertexes:
      if (VertexesDrawSphere[contador] == 1):
        if (VertexesConnections[contador] > 1) or (RoundingCorners >= 2):
          if (VertexesConnections[contador] == 1) :
            SingleVertexPlacement = SingleVertex.Point
            finalShape = finalShape.fuse( Part.makeSphere(RadiusWire, SingleVertexPlacement, VertexesTangents[contador][0], -90, 0, 360 )  )
          else :
            SingleVertexPlacement = SingleVertex.Point
            finalShape = finalShape.fuse( Part.makeSphere(RadiusWire, SingleVertexPlacement )  )
      contador += 1
#    for n in range(len(AllVertexes)):
#      FreeCAD.Console.PrintError("Vértices (" + str(n) + " ," + str(VertexesNames[n] ) + ") = " + str(VertexesConnections[n] ) + "\n" )

  #finalShape = finalShape.removeSplitter()
  #finalShape = Part.Solid(finalShape.childShapes()[0])  
  Gui.ActiveDocument.getObject( MainObject.Name ).Visibility = False
  return finalShape


  
class SMWireEdge:
  def __init__(self, obj):
    '''"WireEdge" '''
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba init")
    selobj = Gui.Selection.getSelectionEx()[0]
    
    obj.addProperty("App::PropertyLength","Radius","Parameters","Radious of wires").Radius = 0.5
    obj.addProperty("App::PropertyInteger","Rounding","Parameters","Rounding of vertex (0 none, 1 only at ends, 2 always)").Rounding = 0
    obj.addProperty("App::PropertyLinkSub", "baseObject", "Parameters", "Base object").baseObject = (selobj.Object, selobj.SubElementNames)
    obj.Proxy = self

  def execute(self, fp):
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba execute (" + str(self) + ")(" + str(fp.baseObject[0]) + ")")
    FreeCAD.Console.PrintMessage("Hola")
    FreeCAD.Console.PrintError("Error")
    s = smWireEdge(RadiusWire = fp.Radius.Value, RoundingCorners = fp.Rounding, selFaceName = fp.baseObject[1], MainObject = fp.baseObject[0])
    fp.Shape = s
    

class SMWireEdgeCommandClass():
  """WireEdge"""

  def GetResources(self):
    return {'Pixmap'  : os.path.join( iconPath , 'SMWireEdge.svg') , # the name of a svg file available in the resources
            'MenuText': "Wire edges" ,
            'ToolTip' : "Wire edges of object"}
 
  def Activated(self):
    print "test"
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","WireEdge")
    #mw=FreeCADGui.getMainWindow()
    #QtGui.QMessageBox.information(mw,"Error","Prueba Activated" + str(a))
    SMWireEdge(a)
    SMViewProviderTree(a.ViewObject)
    FreeCAD.ActiveDocument.recompute()
    return
   
  def IsActive(self):


    if len(Gui.Selection.getSelection()) == 1:
      return True
    return False

Gui.addCommand('SMWireEdge',SMWireEdgeCommandClass())
Attachments
Pwned.zip
Version with problem in Sphere matrix.
(33.32 KiB) Downloaded 50 times
No todas las "BezCurvas" funcionan igual de bien.
No todas las "BezCurvas" funcionan igual de bien.
WireEdgeD.PNG (164.33 KiB) Viewed 1867 times
Sin esfera, al final la quité con una chapuza: restar antes de sumar nada otra esfera más grande.
Sin esfera, al final la quité con una chapuza: restar antes de sumar nada otra esfera más grande.
WireEdgeC.PNG (133.38 KiB) Viewed 1867 times
Last edited by Joyas on Wed Mar 16, 2016 4:48 pm, edited 1 time in total.
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Herramienta alambrizar y Dudas sobre python (mostrar info en consola)

Post by Joyas »

Aquí os dejo de forma experimental el banco de trabajo "Parts with new enhanced details" (partes con nuevos detalles realzados), que abreviadamente denominaré por sus iniciales. :D

Recordad que no es ni prealfa, puede fallar y todo eso, la licencia sigue siendo GPL, porque salvo permiso de todos los autores previos en los que te hayas basado, no se puede cambiar.

Ahora intentaré mirar lo del icosaedro, necesitaría una fórmula que sitúe los vértices, o al menos sus ángulos, así que a investigar a la Wikipedia. :lol:

Edito 1: mejor empiezo añadiendo un antiprisma (antiprism), es una figura interesante y que ahorraría bastante trabajo tenerla con un botón.
https://en.wikipedia.org/wiki/Antiprism

Edito 2: para no molestar añadiré aquí las sucesivas versiones y pantallazos. De momento os enseño el antiprisma, eso si... ¡Sólo permite hacer el lateral y sólo permite hacerlo completo! Mi idea es poder permitir más cosas: girarlo, realizar sólo una parte, permitir una base superior más pequeña o grande, permitir una base superior girada respecto a la inferior, y por supuesto permitir cerrarlo para que sea un sólido con el que se pueda jugar. El objetivo es huír de cualquier opinión experta en usabilidad de la corriente GUIlosófica del "quita esto, quita aquello", que acaban convirtiendo programas de utilidad en juguetes para niños pequeños. De hecho un detalle clave es que en principio los prismas van a ir centrados respecto a su centro de gravedad y no sobre la base inferior, aunque se podría añadir una opción para que pueda aparecer sobre la base inferior.
Attachments
Prueba usando dos herramientas, una de desplazamiento y otra del banco Parts with new enhanced details.
Prueba usando dos herramientas, una de desplazamiento y otra del banco Parts with new enhanced details.
Antiprisma_0.png (147.84 KiB) Viewed 1845 times
Pwned.zip
(33.52 KiB) Downloaded 48 times
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
Post Reply