vertexEdit

 




  vertexEdit beispiel
 

That thingee cost me days and nights of frustration - actually, the title of this page should read like the subject line of a related post to direct-L, "vectorShape desparation".

Besides, its not complete, it's not bug - free, it's not a standalone widget but part of a framework of objects which I'm not going to make public.
The scripts will compile but won't run, since they make reference to global and ancestored handlers which are missing here.
Anyway, the names of the missing handlers are pretty descriptive and with the limitation to just one shape you can pretty much delete all the gotFocus/lostFocus/demandFocus stuff and the save/restore functions. I think its a start for creating your own version.

 
the shape's have a behavior like this:

-- DemoShapeBeh

property ancestor,spritenum

on beginsprite me
  ancestor = new (script "aShapeObj")
  init me
end

-- EoS


and this is the object which does the real work:

------- parent script aShapeObj
-- (@) Daniel Plaenitz, http://www.lingo.de
-- 11/99

-- regiert ein VectorShape

property ancestor,mySelf

property myMbr
property myVertexList
property myOrgRegpoint

property myhaveFocus
property myLDotSprites

property myLastLoc
property myDirtyF

on new me
  return me
end

on init me
  -- alle Instanzen teilen sich einen ancestor
  dObj = getObjekt(#entityObj)
  if dObj.ilk <> #instance then 
    dObj = new(script "entityObj")
    setObjekt #entityObj,dObj
  end if
  ancestor = dObj
  
  me.addChild(me)
  
  -- sprite Eigenschaften
  puppetSprite (me.spriteNum) , TRUE
  
  -- memberEigenschaften
  
  myMbr = sprite(me.spritenum).member
  myMbr.originmode = #topleft
  myMbr.centerregpoint = FALSE
  myOrgRegpoint = myMbr.regpoint
  
  -- Liste der handles
  myLDotsprites = []
  
  myLastLoc = sprite(me.SpriteNum).Loc
end

on forgetSprite me
  -- das ruft ein vectorShapeSprite, wenn er sich abmeldet
  puppetsprite (me.spriteNum) , FALSE
  me.killChild(me)
end


on mouseUp me
  -- eigentlich: sag dem entityObj, dass ich jetzt dran sein will  
  -- alles weitere passiert dann auf dessen Initiative
  
  if not myHaveFocus then 
    me.demandFocus()
  end if
  
end

on exitFrame me
  if not myHaveFocus then return  
  me.checkIfMoved()
end 



--------------------------------------------

on lostFocus me
  --put #lostFocus,me.Spritenum
  myHaveFocus = FALSE
  me.hideEditDots()
  
  sprite(me.Spritenum).moveableSprite = FALSE
  
end

on gotFocus me
  myHaveFocus = TRUE  
  
  sprite(me.Spritenum).locZ = me.getTopSprite()
  
  me.showEditDots()
  sprite(me.Spritenum).moveableSprite = TRUE
  
end

on getSpriteNum me
  return me.SpriteNum
end

-------------------------------------------
-- debug

on testDifferenz me, lp1,lp2
  cnt = lp1.count
  repeat with rum = 1 to cnt
    dProp = lp1.getPropat(cnt)
    v1 = lp1.getaProp(dProp)
    v2 = lp2.getaProp(dProp)
    if v1 <>  v2 then 
      put "properties ungleich:" && dProp 
      put v1
      put v2
      put
    end if
  end repeat
  
  return ""
end

on putProps me
  dLp = (script "shapePropsObj").suckPropsfromMbr (myMbr)
  put #mbrRect,   myMbr.rect
  put #spriteRect, (sprite(me.SpriteNum).rect)
  put #regPoint, dLp.regPoint
  put #originPoint,dLp.originPoint
  put
  
end

--------------------------------------------
-- save / restore

on exportProps me
  dLp = (script "shapePropsObj").suckPropsfromMbr (myMbr)
  dLp.addProp (#orgRegpoint,myOrgRegPoint)
  dLp.addProp (#Loc,sprite(me.spriteNum).loc)
  return dLp
end


on importProps me,dLp
  if myMbr.type = #vectorshape then
    (script "shapePropsObj").givePropsToMbr (myMbr,dLp)
  end if
  
  myOrgRegPoint = dLp.orgRegPoint
  sprite(me.spriteNum).loc = dLp.loc
  
  --demandFocus me
end




--------------------------------------------
on checkIfMoved me
  -- muss von jedem sprite ausgefuehrt werden, 
  -- wenn verschieben direkt moeglich ist (moveable)
  
   myLoc = sprite(me.spriteNum).loc
   myVec = myLastLoc - myLoc
  if myVec = point(0,0) then return
  
  
  
   myLastLoc = myLoc
  tellGroupMove me,myVec
   myDirtyF = TRUE
end

on tellGroupMove me,dVec
  repeat with dSprite in myLDotSprites
    sendSprite dsprite,#moveSprite,dVec
  end repeat
end



--------------------------------------------
on convScreenKoords2Vertex me,dScreenPoint
  dLoc = sprite(me.spritenum).loc
  dregP = myOrgRegPoint --myMbr.regPoint
  dOrigP = myMbr.originPoint
  
  dScreenVec = dScreenPoint - dLoc
  dMemVec = dOrigP - dregP 
  dvertexP = dScreenVec - dMemVec
  return dVertexP
end

on convVertex2ScreenKoords me,dVertexPoint
  dLoc = sprite(me.spritenum).loc
  dregP = myOrgRegPoint --myMbr.regPoint
  dOrigP = myMbr.originPoint
  
  dMemVec = dOrigP - dregP
  dScreenVec = dVertexPoint + dMemVec
  dScreenPoint = dScreenVec + dLoc
  
  return dScreenPoint
end


on xconvScreenKoords2Vertex me,dScreenPoint
  origin =  sprite(me.spritenum).loc - myMbr.originPoint
  dvertexPoint = (dScreenPoint - origin) * 1.0
  
  return dvertexPoint
end
on xconvVertex2ScreenKoords me,dVertexPoint
  origin =  sprite(me.spritenum).loc - myMbr.originPoint
  dScreenPoint  = (dvertexPoint + origin)
  dScreenPoint[1] = integer(dScreenPoint[1])
  dScreenPoint[2] = integer(dScreenPoint[2])
  
  return dScreenPoint
end

----------------------------------

on moveVertexWithSprite me,dDotSprite,dVec
  dPos = myLDotSprites.getPos(dDotSprite)
  
  if not dPos then return
  moveVertex ( myMbr, dPos, -dvec[1], -dvec[2] )
  
  myDirtyF = TRUE
end

---------------------------------------------------------------
-- dots verwalten

on dotEvent me,dDotSprite,LParam
  
  if LParam.count > 0 then
    dEvent = LParam[1]
    
    if dEvent = #moved then
      dVec = LParam[2]
      me.moveVertexWithSprite (dDotSprite,dVec)
    end if
    
  else
    put #dotEvent,dDotSprite,LParam  
  end if
end


on showEditDots me
  dvertexList = myMbr.vertexList
  cnt = dVertexList.count
  repeat with rum = 1 to cnt
    dVertex = dVertexList[rum]
    dVertexPoint = dVertex.vertex
    dScreenPoint = convVertex2ScreenKoords (me,dVertexPoint)
    me.makeAdot(dScreenPoint)
  end repeat
end

on hideEditDots me
  farOut = point (0,0) - 5000
  cnt = myLDotSprites.count
  repeat with rum = 1 to cnt
    dSprite = sprite(myLDotSprites[rum])
    (dSprite).Loc = farOut
    (dSprite).puppet = FALSE
  end repeat
  myLDotSprites = []
end


on MakeADot me,dScreenPoint
  
  dLp = [#member:member "dot_up",#forecolor:255,#loc:dScreenpoint]
  addProp dLp,#behavior, "dotBeh"
  addProp dLp,#moveableSprite,TRUE
  
  dSprite = getEmptySprite(me,sprite(me.Spritenum).locZ)
  me.spriteVoodoo(dSprite,dLp)
  
  sendSprite (dSprite,#setruler,me)
  myLDotSprites.append(dSprite)
end

on spriteVoodoo me,dSprite,dLp
  if integerP(dSprite) then
    
    puppetSprite dSprite,TRUE
    repeat with rum = 1 to dLp.count
      dProp = dLp.getPropAt(rum)
      
      case dProp of
        #member:
          sprite (dSprite).member = dLp.member
        #ink:
          sprite (dSprite).ink = dLp.ink
        #behavior:
          -- behaviors an leere sprites zu kleben ist richtig arbeit
          
          sprite (dSprite).scriptInstanceList = [ ( new(script (dLp.behavior)) ) ]
          sendSprite (dSprite,#beginSprite)
          sendSprite (dSprite,#setMySprite, dSprite)
        #rect:
          sprite (dSprite).rect = dLp.rect
        #loc:
          sprite (dSprite).loc = dLp.loc
        #moveableSprite:
          sprite (dSprite).moveablesprite = dLp.moveablesprite
        #trails:
          sprite (dSprite).trails = dLp.trails
        #backColor:
          sprite (dSprite).backcolor = dLp.backcolor
        #forecolor:
          sprite (dSprite).forecolor = dLp.forecolor
      end case
    end repeat
  end if
end



--------------------------------------------------





Home shock + cgi Bits 'n pieces Director Lingo Shocklets Contact










pageID=l_vertexEdit