Attribute Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nebeig
User
Beiträge: 11
Registriert: Freitag 20. April 2018, 14:20

Hallo Zusammen
Ich programmiere den Space Colonization Algorithmus als Addon für Blender. Und jetzt kommt diese Fehlermeldung:

TypeError: __init__() missing 1 required positional argument: 'p'
bei tree = Tree() und bei setup(self) in def execute

Code: Alles auswählen

import bpy
from .tree import Tree, grow, show
from .Branch import Branch, reset, nextv
from .Leaf import Leaf


def setup(self):
    tree = Tree()
    
    
def main(context,self,tree):
    self.tree.show()
    self.tree.grow()
    
    
class AddTree(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.simple_operator"
    bl_label = "Simple Object Operator"

    def execute(self, context):
        setup(self) 
        main(context,self,tree)
        
         
def register():
    bpy.utils.register_class(AddTree)


def unregister():
    bpy.utils.unregister_class(AddTree)


if __name__ == "__main__":
    register()
           
bpy.ops.object.simple_operator()   
Und hier nochmals in der linie self.branches = array[Branch()]

Code: Alles auswählen

class Tree:
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_label = 'Tools Tab Label'
    bl_context = 'objectmode'
    bl_category = 'SC'
    
    def __init__(self):
        self.branches = array[Branch()]
        self.leaves = array[Leaf()]
        i = 0
        while(i < 1000):
            self.leaves.add(Leaf())
            i += 1
        root = Branch(Vector(0,0,0), Vector(0, -1))
        self.branches.add(root)
        current = Branch(root)
        while not self.closeEnough(current):
            trunk = Branch(current)
            self.branches.add(trunk)
            current = trunk
Ich verstehe nicht wieso er gerade ein 'p' vermisst.
Vielen Dank schon im Voraus
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nebeig: was genau vermißt wird, mußt Du in der Dokumentation zu Tree nachlesen. Der Parametername `p` allein ist halt nicht sehr aussagekräftig.
Nebeig
User
Beiträge: 11
Registriert: Freitag 20. April 2018, 14:20

bei diesem dokument habe ich ein p für die position

Code: Alles auswählen

from mathutils import Vector
import bpy



def dir(v):
        n = len(v)//3
        x=0
        y=0
        z=0
        for i in range(n):
            x += v[i*3  ]
            y += v[i*3+1]
            z += v[i*3+2]

        return (x,y,z),x*x+y*y+z*z
    
class Branch:
	   def __init__(self, p):
            self.v = Vector()
            self.count = 0
            self.len = 5
            self.parent = p
            self.pos = self.parent.next()
            self.dir = self.parent.dir.copy()
            self.saveDir = self.dir.copy()
           
    
def reset(self):
    self._count = 0
    self._dir = self._saveDir.copy()

def nextv(self):
    v = Vector.mult(dir, len);
    nextv = Vector.add(pos, v);
    return next;
 
könnte da etwas schiefgegangen sein?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nebeig: es ist schwierig Dir zu helfen, weil der Code nicht wie typisches Python aussieht. Woher kommen Tree und Branch und Leaf? `p` steht für Parent nicht für Position. In dem von Dir gezeigten Code hat es auch noch viele Fehler, falsch Einrückungen, falsch geschriebene Variablennamen, etc.
Beschreib doch, was Du machen willst.
Nebeig
User
Beiträge: 11
Registriert: Freitag 20. April 2018, 14:20

Tut mir leid für die vielen Fehler. Die könnten daher kommen, dass ich den Code zuerst in Java programmiert hatte und ich mich in Python noch nicht ganz so gut auskenne :(
Die Idee ist es, dass ich in Leaf zufällige Punkte in einem gewissen Raum generieren möchte.
Der Branch Text Block soll mir den Stamm und die Äste zeichnen. Sie bestehen auch nur aus Punkten mit Information über die Richtung und die Koordinaten des Parent (damit man eine Linie zeichnen kann. Weiss leider nicht ob Line der richtige Ansatz ist.
Der Tree Text Block ist der Block in dem alles passieren sollte.(Den habe ich ganz unten angehängt)

Link : http://procworld.blogspot.ch/2011/02/sp ... ation.html

Hier kommt das Leaf her. Ich habe für den Baum verschiedene Text Blöcke angelegt. Einen für das Leaf, einen für Branch, einen für Tree und einen mit register() und unregister()

Code: Alles auswählen

from random import random
import bpy
from mathutils import Vector


def sphere(r,p):
    r2 = r*r
    while True:
        x = (random()*2-1)*r
        y = (random()*2-1)*r
        z = (random()*2-1)*r
        if x*x+y*y+z*z <= r2:
            yield p+Vector((x,y,z))


class Leaf(object):
	def __init__(self):
		self.reached = False
		self.pos.x = Vector.random(-5,5) 
		self.pos.y = Vector.random(-5,5) 
		self.pos.z = Vector.random(1,4) 
		self.add(sphere(5,Vector((0,0,8))))

	def reached(self):
		self.reached = True

	def show(self):
		self.pushMatrix()
		self.translate(self.pos.x, self.pos.y, self.pos.z)
		self.sphere(5,Vector((0,0,8)))
		self.popMatrix()
Tree():

Code: Alles auswählen

from mathutils import Vector
from array import array
import bpy
from .Branch import Branch



def closest(pos, count, n, x, y, z):
        d2 = 1e30
        for i in range(n):
          if count[i] > 1 : continue
          dx, dy, dz = x-pos[i*3], y-pos[i*3+1], z-pos[i*3+2]
          d = dx*dx + dy*dy + dz*dz
          if d < d2:
            d2 = d
            ci = i
            v = dx,dy,dz
        return d2, ci, v

class Tree:
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'
    bl_label = 'Tools Tab Label'
    bl_context = 'objectmode'
    bl_category = 'SC'
    
    def __init__(self):
        self.branches = array[Branch(p)]
        self.leaves = array[Leaf()]
        i = 0
        while(i < 1000):
            self.leaves.add(Leaf())
            i += 1
        root = Branch(Vector(0,0,0), Vector(0, -1)) #hier sollte der erste Vektor die Position sein und der zweite die Richtung
        self.branches.add(root)
        current = Branch(root)
        while not self.closeEnough(current):
            trunk = Branch(current)
            self.branches.add(trunk)
            current = trunk
 


  
  
def grow(self):
        for i in range (leaves.size()):
            Leaf(l,leaves.get(i)) 
            self.closestBranch = None
            self.Vector.closestDir = None 
            self.record = -1

        for i in range (branches.size()):
            Branch(b,branches.get(i))  
            self.Vector.dir = Vector.sub(self.l.pos,self.b.pos)
            self.d = self.dir.mag()
            if (d < min_dist):
                self.l.reached = None
                break
            elif(d > max_dist):
                if (self.closest == None or d < self.record) :
                    self.closest = b
                    self.closestDir = dir
                    self.record = d
                
            
            
        if (self.closest != None) :
            self.closestDir.normalize()
            self.closest.dir.add(closestDir)
            self.closest.count+=1
        
        
        for i in range (leaves.size()-1):
            if (leaves.get(i).reached):
                leaves.remove(i)
                
        
        for i in range (leaves.size()-1):
            if (leaves.get(i).reached):
                leaves.remove(i)
            i-=1
                
        for i in range (branches.size()-1):
            Branch(b,branches.get(i)) 
            if (b.count > 0):
                self.dir.b.div(b.count)
                self.dir.b.normalize()
                newB = newBranch(b)
                branches.add(newB)
                b.reset()

def show() :
    for i in range (leaves.size()):
        Leaf(l,leaves.get(i))  
        l.show()
        i+=1
        
   
    for i in range (branches,size()) :
      Branch(b,branches.get(i))  
      i+=1
      if (self.b.parent != None) :
       line(self.b.pos.x, self.b.pos.y, self.b.pos.z, self.b.parent.pos.x, self.b.parent.pos.y, self.b.parent.pos.z)
Branch ():
Bei Branch(self.v, self.v) : will ich diese beiden Vektoren beschreiben. Leider gibt es einen Syntax Error :(

Code: Alles auswählen

from mathutils import Vector
import bpy



def dir(v):
        n = len(v)//3
        x=0
        y=0
        z=0
        for i in range(n):
            x += v[i*3  ]
            y += v[i*3+1]
            z += v[i*3+2]

        return (x,y,z),x*x+y*y+z*z
    
class Branch:
    def __init__(self, p):
            self.v = Vector(p)
            self.count = 0
            self.len = 5
            self.parent = p
            self.pos = self.parent.next()
            self.dir = self.parent.dir.copy()
            self.saveDir = self.dir.copy()
    
    Branch(self.v, self.v) : 
        parent = None
        pos = v.copy()
        dir = d.copy()
        saveDir = dir.copy()
    
    
    def reset(self):
            self._count = 0
            self._dir = self._saveDir.copy()

    def nextv(self):
        v = Vector.mult(dir, len);
        nextv = Vector.add(pos, v);
        return next;
  
 
Tut mir leid falls es noch irgendwelche offensichtliche Fehler hat.
Trotzdem danke, dass du immernoch hilfst.
Nebeig
User
Beiträge: 11
Registriert: Freitag 20. April 2018, 14:20

Habe den Fehler behoben(glaube ich).
In Tree hat bei dem array Branch in den Klammer ein p gefehlt.
Jetzt habe ich ein anderes Problem: Laut der Konsole ist der Name array nicht definiert.
Dieser Array sollte alle Punkte der Stämme und Äste beinhalten.

Code: Alles auswählen

def __init__(self):
        self.branches = array[Branch(p)]
        self.leaves = array[Leaf()]
        i = 0
        while(i < 1000):
            self.leaves.add(Leaf())
            i += 1
        root = Branch(Vector(0,0,0), Vector(0, -1))
        self.branches.add(root)
        current = Branch(root)
        while not self.closeEnough(current):
            trunk = Branch(current)
            self.branches.add(trunk)
            current = trunk
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nebeig: in allen Programmiersprachen ist die Schreibweise von Namen mehr oder weniger wichtig. Auch in Java ist `_dir` etwas anderes als `dir`, oder dass wenn man ein `nextv` definiert kein `next` zurückgeben sollte. Bei Dir ist `array` nicht definiert, und falls doch, wäre ein Indexzugriff mit einem Branch-Objekt sehr seltsam. Du willst wahrscheinlich eine Liste erzeugen, und dazu reichen die eckigen Klammern. Aber ohne wirklich Python zu lernen, wirst Du mit bloßem Raten nicht weit kommen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du willst auch eine Liste. Einfach [ding1, ding2] genügt.
Nebeig
User
Beiträge: 11
Registriert: Freitag 20. April 2018, 14:20

Ok. Danke Vielmals!
Antworten