Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 9. 4. 2017 12:27:45

Gooorila
Člen
Registrace: 4. 10. 2009
Příspěvků: 43

Vkládání obrázků dle hodnot a jejich přesné poziciování

Dobrý den

Potřebuji pomocí Calcu vytvářet výrobní šablony, jejichž jedna část je jakýsi okótovaný vodorovný a svislý řez výrobkem. Nyní mám jednu šablonu pro jednu variantu výrobku, ale díky množství variant, které se násobí, se dostávám ke stovkám potřebných šablon. Proto chci také tyto řezy vyřešit makrem, takže:


1) Mám dva typy zárubňového profilu
2) Mám dva typy dveřního křídla


Potřebuji pomocí formuláře zvolit u zárubně a u dveřního křídla správnou variantu. Na konkrétní místo v Calcu se mi pak vloží obrázek, který odpovídá právě zvolené variantě. Našel jsem tedy nějaké makra, které takto vkládají obrázky, ale narazil jsem na dva problémy:


1) Pomocí čar a šipek jsou pak na konkrétním místě vytvořeny jakési kóty, jejichž hodnoty počítá Calc. Proto potřebuji, aby se právě obrázek umístil přesně, což se neděje. Obrázek se většinou vkládá na adresu buňky. Nejde to nějak pomocí souřadnic, které bych nastavil tak, aby na sebe vše navazovalo. Nebo nenapadá někoho nějaká alternativa?


2) Vložím u zárubně variantu číslo 1, ale potřebuji tuto volbu měnit, třeba za variantu 2. Makro umí nejdříve smazat původní obrázek a pak vložit nový. Jenže když vložím obrázek dveří, udělá to stejné a zase mi smaže obrázek zárubně. Předokládám, že by se měo vyřešit tím, že jedno makro bude pro vkládání profilu zárubně, druhé bude pro vkládání dveří. Mazání předešlého obrázku by probíhalo, ale řekněme jen v rodině variant toho makra, takže by se mi neměly mazat navzájem.


Trápím se tím delší dobu, ale nepřišel jsem na řešení. Neřešili jste někdy něco podobného, nebo neznáte nějakou podobnou šablonu? Upravit si již hotové makro již snad nějak zkusím, ale zatím jsem zkoušel dvě a vždy se stejným výsledkem.

Editoval Gooorila (9. 4. 2017 12:28:06)

Offline

#2 9. 4. 2017 14:48:57

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 485

Re: Vkládání obrázků dle hodnot a jejich přesné poziciování

Vkládání na přesnou pozici kde souřadnice 0,0 je v levém horním rohu je celkem jednoduché:

sub VlozObrNaPozici

Dim sGraphicURL As String
Dim oDrawPage As Object, s1 as Object
Dim oGraphic As Object, oShape as object
Dim TheSize As New com.sun.star.awt.Size
Dim aPosition As New com.sun.star.awt.Point

  s1 = ThisComponent.Sheets.GetByName("List1")
  sGraphicURL = s1.GetCellRangeByName("A1").String
  sGraphicURL = convertToURL(sGraphicURL)
  
'načtení DrawPage a GraphicService
  oDrawPage = s1.getDrawPage()
  oGraphic = ThisComponent.createInstance("com.sun.star.drawing.GraphicObjectShape")

'předání adresy
  oGraphic.GraphicURL = sGraphicURL

'nastavení pozice
  aPosition.X = 15000 'setin milimetru
  aPosition.Y = 7000 'setin milimetru
  oGraphic.setposition(aPosition)
 
'nastavení velikost 
  TheSize.width=4200 'setin milimetru
  TheSize.height=4200 'setin milimetru
  oGraphic.setsize(TheSize)

'vložení obrázku  
  oDrawPage.add(oGraphic)
  
end sub

Druhou část vašeho problému lze řešit pojmenováním obrázku. Tzn. při vložení musít dát obrázku jméno a to pak "hlídat" při mazání.

oGraphic.setname("tohlejeobrazekcislojedna")

Mazání obrázků s ošetřením jména je uvedeno zde: https://forum.openoffice.cz/viewtopic.php?id=4386


EDIT: při mazání obrázků je potřeba všechny obrázky procházet cyklem a hledat to pravé jméno obrázku co chcete smazat. Více obrázků může mít stejné jméno, pak budou smazány všechny toho jména. Pokud tedy budou na obrazovce vždy jen dva proměnlivé obrázky vkládané makrem tedy zárubeň a křídlo, pak není těžke si nad jejich názvy udržet kontrolu a také je kontrolovaně mazat. Vlastně budete používat jedn dva nazvy "zaruben" a "kridlo". Příkaz ke smazání obrazku předcházet příkazu k vykreslení jineho obrazku stejneho jmena.

Sub VlozZaruben
 RemoveImg ("zaruben")
 adresa = "d:\_prace\AUTO\IT\qr_cody\qr_autonapul_cz_zeleny_2.jpg" 
 VlozObrNaPozici(15000, 1000, adresa, "zaruben")
end sub

Sub VlozKridlo
 RemoveImg ("kridlo")
 adresa = "d:\_prace\AUTO\IT\qr_cody\qr_autonapul_cz_sedy_zeleny.jpg"
 VlozObrNaPozici(5000, 1000, adresa, "kridlo")
end sub 

sub VlozObrNaPozici(xx as long, yy as long, adresa as string, nazev as string)

Dim sGraphicURL As String
Dim oDrawPage As Object, s1 as Object
Dim oGraphic As Object, oShape as object
Dim TheSize As New com.sun.star.awt.Size
Dim aPosition As New com.sun.star.awt.Point

  s1 = ThisComponent.CurrentController.getActiveSheet()
  sGraphicURL = convertToURL(adresa)
  
'načtení DrawPage a GraphicService
  oDrawPage = s1.getDrawPage()
  oGraphic = ThisComponent.createInstance("com.sun.star.drawing.GraphicObjectShape")

'předání adresy
  oGraphic.GraphicURL = sGraphicURL

'nastavení pozice
  aPosition.X = xx 'setin milimetru
  aPosition.Y = yy 'setin milimetru
  oGraphic.setposition(aPosition)
 
'nastavení velikost 
  TheSize.width=4200 'setin milimetru
  TheSize.height=4200 'setin milimetru
  oGraphic.setsize(TheSize)
  
'pojmenování obrázku
  oGraphic.setname(nazev)

'vložení obrázku  
  oDrawPage.add(oGraphic)
end sub

Sub RemoveImg (nazev as string) 
   oSheet = ThisComponent.CurrentController.getActiveSheet()
   oDP = oSheet.DrawPage
      
   for i = oDP.Count - 1 to 0 step -1
      oObj = oDP.getByIndex(i)
      TextString = oObj.getname
      If TextString = nazev Then 
         oDP.remove(oObj) 'smaž obrázek
      end if
   next i
End sub

Editoval ludviktrnka (9. 4. 2017 20:30:41)


LibreOffice 5.2.2.2

Offline

#3 9. 4. 2017 16:28:16

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,229

Re: Vkládání obrázků dle hodnot a jejich přesné poziciování

Problém mazání obou obrázků (nevhodně spárovaných) lze řešit zřejmě jen pomocí jména. Ale je asi vhodnější - snadnější zavolat novou správně napárovanou volbu.


     Problém je v mazání DrawPage - co list to jiná drawpage - jediná pro celý list. Když se tedy maže Drawpage - smaže se celá. Jméno by to mělo vyřešit ale při tisíci variantách to může být problém. Pokud jsou názvy jednoznačné - tedy nezaměnitelně unikátní tak by to neměl být problém.


     Pokud ale nevíte jestli náhodou stejná zkratka (název) není užit jinde tak to ani nezkoušejte. Je sice možné vše otestovat ale jestli názvy přiděluje výroba - pochybuji o úspěchu. Místo názvu by šlo použít katalogové číslo - pokud máte výrobky standardizované. Zase je mi jasné že nabízíte atypy podle potřeby zákazníků takže normalizovaný je materiál zárubní a dveřních křídel - rozměry se případ od případu liší (mohou se lišit poměrně často i pro původní paneláky..:-)


     Problém je celkem řešitelný několika způsoby. Tím nejsnadnějším je struktura adresářů. Prostě
základní (root) adresář "katalog". Tam například složky dveře, okna, balkony, .... Každý subadresář například okna bude obsahovat další adresáře Typ (dřevo, hliník, plast,...) a další rozdělení v nich jako subadresáře. Nakonec například u těch dvěří bude adresář profil který bude obsahovat všechny kombinovatelné druhy pro jednotlivý profil.
     Nemělo by se stát že budou v nadřazeném adresáři Profil_X obsaženo více jiných profilů - nejvýš varianty X-profilů jako velikost nebo síla stěny a pak třeba povrch - elox, barva ap.


     Po najetí do adresáře určitého profilu už by měly vyskočit ony dvě nebo více variant. Při takovéhle struktuře si můžete dovolit párovat přesně. Má to ale také své ALE....
     Je potřebné nabízet náhledy na různé úrovně adresářů. Jestliže je potřebné vybrat profil, otevře se souhrnný 1 obrázek všech různých profilů. Může to být vygenerováno cyklem do struktury přehledu, ale může to být také skutečně jediný obrázek se všemi různými. Po výběru se DrawPage smaže a zobrazí ta z volby.


     Jakmile zákazník vybere profil dostane nabídku schematu druhu dveří (předpokládám levé a pravé). Jakmile vybere i dveře smaže se drawPage a vyskočí přímo výrobní výkresy, nebo ještě také specifikace počet, barva .....
     Při tom výrobní výkresy mohou být sloučené s obrázkem profilu dopředu, ale mohou se jen překrýt při výběru protože se bude jen tisknout - je jedno jak jsou obrázky svázané.


     Ten výběr je možné dělat velice elegantně - voláním obsahu adresáře - a může to být do DrawPage, ale také do dialogu kde se vybere například kombinace pomocí CheckBoxu, nebo se vyberou profily seznamem a dveře také.
     Po výběru se dialog deaktivuje a vyskočí výrobní výkresy do DrawPage. Je to ale jenom takové "estetické vylepšení". Totéž je možné udělat (nasimulovat v DrawPage). Tím myslím výběr pomocí seznamů (roletek) nebo tlačítek jako v prezentaci.


     Ony ty roletky mohou být "konsolidací" a nemusí to být prvky umístěné na drawpage takže po smazání drawpage zůstanou navolené a nové obrázky se načtou podle propojených polí.


     Viděl bych ještě jinou možnost. Do každého listu dáte jiný obrázek a na jednom z listů načítáte dde (OLE objekt) nehledě k možnosti nahlížet na dva listy současně. Tam potom na svém listu volba drží a měníte jen tu druhou.


     Takže řešení je možné poměrně různě a Vy byste měl volit to co je nejlepší pro Vaši práci. Osobně bych začal strukturou adresářů - není to žádný problém. Je pravdou že vše může být v jediném adresáři a když se udrží unikátnost označení nebude to problém.
     Struktura adresářů ale usnadňuje editaci zdrojů. Při udržení struktury adresářů můžete používat i názvy které by v jednom adresáři kolidovaly. Prostě nemusíte se označením zabývat - jen dbát aby nějaké unikátní v určitém adresáři bylo.


     Dokonce bych viděl možnost udělat strukturu za běhu. Do dialogu se načte obrázek a Vy mu dáte adreář který se při ukládání sám vytvoří. V dialogu pak může být prvek "TREE" - tedy stromová struktura abyste na ni viděl a obrázku přidělil adresu podle účelu. To bylo potřebné v případě že máte obrázky v chaoticky vytvořených adresářích.


     Popřemýšlejte jak by Vám to vyhovovalo a zda potřebujete pomoct. Myslím že byste to uměl udělat i sám. Jde jen o to, že budete volat adresáře bez konkrétního souboru. Ty se načtou už do DrawPage samy (makrem). Při zavolání dilogu (FilePicker) uvidíte jaké tam jsou soubory, a tím si potvrdíte že je otevřen správný folder. Pouze místo otevření (konkrétního souboru) načtou se obrázky hned do sešitu - myslím že je to pochopitelné.

Editoval neutr (9. 4. 2017 16:30:45)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#4 9. 4. 2017 20:13:49

Gooorila
Člen
Registrace: 4. 10. 2009
Příspěvků: 43

Re: Vkládání obrázků dle hodnot a jejich přesné poziciování

Děkuji za makro. Pokusím se zjistit, co jaký řádek dělá.

Offline

Zápatí