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

#1 8. 1. 2019 14:29:46

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 63

Draw: makro pro operace s křivkami Sloučit/Odečíst/Průnik [VYŘEŠENO]

Nevíte někdo, jak makrem udělat na vybraných křivkách to co z menu: Tvar -> Sloučit/Odečíst/Průnik?


Následující makro vloží do stránky v Draw dva obdélníky a označí je, takže poté jdou ručně z menu udělat ty operace, ale jak makrem?
Jiné metody z menu Tvar -> např. Seskupit/Zrušit skupinu; Složit/Rozdělit; Spojit/Rozpojit jdou pomocí metod které obsahuje v uvedeném makru proměnná oPage ('msgbox oPage.dbg_methods), ale Sloučit/Odečíst/Průnik tam není a nikde jsem to nenašel.


Sub twoRectangles 'vloží do stránky Drawu 2 obdélníky a označí je
	dim oDrawDoc,oPage,oRect1,oRect2,oShapes,oSelect
	oDrawDoc=thisComponent
	oPage=oDrawDoc.getDrawPages().getByIndex(0)
	'msgbox oPage.dbg_methods 'metody např. pro Složit/Rozdělit atd.

	rem vložit obdélník1
	oRect1=oDrawDoc.createInstance("com.sun.star.drawing.RectangleShape")
	oRect1.setPosition(createPoint(1000, 1000))
	oRect1.setSize(createSize(4000, 3000))
	oPage.add(oRect1)

	rem vložit obdélník2
	oRect2=oDrawDoc.createInstance("com.sun.star.drawing.RectangleShape")
	oRect2.setPosition(createPoint(2000, 1500))
	oRect2.setSize(createSize(5000, 2000))
	oRect2.fillColor=RGB(123,34,78) 'other color
	oPage.add(oRect2)

	rem dát obdélníky do kolekce křivek
	oShapes=createUnoService("com.sun.star.drawing.ShapeCollection")
	oShapes.add(oRect1)
	oShapes.add(oRect2)

	rem označit kolekci
	oDrawDoc.CurrentController.Select(oShapes)
	oSelect=oDrawDoc.getCurrentController().getSelection()

	rem nyní jde ručně: menu Tvar -> Sloučit/Odečíst/Průnik, ale jak to udělat makrem???
End Sub

Function CreatePoint(ByVal x As Long,ByVal y As Long) As com.sun.star.awt.Point 'pro jednodušší zadávání souřadnic
	Dim oPoint
	oPoint=createUnoStruct( "com.sun.star.awt.Point" )
	oPoint.X=x : oPoint.Y=y
	CreatePoint=oPoint
End Function

Function CreateSize(ByVal x As Long,ByVal y As Long) As com.sun.star.awt.Size 'pro jednodušší zadávání velikosti
	Dim oSize
	oSize=createUnoStruct( "com.sun.star.awt.Size" )
	oSize.Width=x : oSize.Height=y
	CreateSize=oSize
End Function

Editoval kamlan (8. 1. 2019 22:24:46)

Offline

#2 8. 1. 2019 20:56:24

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

Re: Draw: makro pro operace s křivkami Sloučit/Odečíst/Průnik [VYŘEŠENO]

Tady asi musíte provést základní geometrické přepočty a následně si postavit nejlépe vlastní colections. Podívejte se sem SourceForge - starší práce Danny Brewer(a). Mám je stažené a makra stále fungují i když soubory mají koncovku sxw - tedy původní formát. Já je používám hodně dlouho a chodí mi to i pod LO Verze: 6.1.4.2 (x64).


     Nejspíš musíte vyzobat to co potřebujete. Možná tam najdete i přímo průmik, nebo sjednocení a podobně. Možná by se daly odněkud načíst práce na prostřih klempířských výrobků a podobně vzorce pro plotry. Myslím že k tomu co popisujete postačuje jednoduchá deskriptivní geometrie.
     Ovšem já už si nepamatuji odkud jsem své knihovny stáhl. Mám knihovny z roku 2004 a možná i ty z roku 2005, ale je jich hodně a pro všechny možné moduly. Od Dannyho beru jen grafiku ale tak často s tím nepracuji. nemám ani přehled co vše jeho knihovny obsahují. Má tam i opravné soubory, ale žádnou chybu jsem nezaznamenenal.
     Možná byste měl udělat lepší rešerši : Danny Brewer + library, programing, draw, open office a podobně. Mám dojem že Denny už není mezi námi a to co odkazuji bude asi jeho poslední práce. To se ale jenom domnívám. Možná že tento projekt jen opustil. V knihovnách Basic je na něho email. Možná by stálo za to poslat dotaz.



     Snad Vám to pomůže. Pokud opravdu chcete suplovat CAD, nebo jiné grafické speciály dopručil bych udělat si převod HPGL (PLT). Tam bývají takové věci popsány a stačila by možná jednoduchá konverze.


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

#3 8. 1. 2019 22:24:21

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 63

Re: Draw: makro pro operace s křivkami Sloučit/Odečíst/Průnik [VYŘEŠENO]

Funguje to přes dispatcher, díky kolegyni na en fóru :-).
http://document-foundation-mail-archive … 55759.html


Po tom označení kolekce aneb za poslední rem stačí přidat:

	dim document as object
	dim dispatcher as object
	document=ThisComponent.CurrentController.Frame
	dispatcher=createUnoService("com.sun.star.frame.DispatchHelper")
	'dispatcher.executeDispatch(document, ".uno:Merge", "", 0, Array()) 'Sloučit
	dispatcher.executeDispatch(document, ".uno:Substract", "", 0, Array()) 'Odečíst
	'dispatcher.executeDispatch(document, ".uno:Intersect", "", 0, Array()) 'Průnik

Tyhle operace potřebuji pro práci s vektory. Když třeba v Draw převedete na křivku číslo 8 (Vložit/Textové pole a Tvar/Převést na Křivku) a pak dáte Tvar/Rozdělit, tak ta osmička celá zčerná. Ale udělá to tři křivky -> jednu s tvarem 8 a další dvě s těmi vnitřními kolečky co byly bílé. Když se to označí, tak třeba pomocí Odečíst se to dá dát zase dohromady na průhledné vnitřky. No a já pro práci s vektory bych využil vícero těch operací. Ty křivky (třeba arabská písmena u kterých bych potřeboval obarvit jen nějaké části) musím rozbít vždy, takže jejich vnitřky vždy zčernají a spojovat je ručně je při vyšším počtu dost marast :-). Ale dnes jsem sesmolil makro, které ty vnitřky zase dá dohromady přes Tvar/Spojit v celé stránce; avšak třeba to Odečíst mi pomůže jinak. Škoda že Draw nemá na to slučování křivek i XOR jako Inkscape, to se pak nemusí řešit která křivka je horní a dolní jako při Odečtení. Nicméně s tím funkčním řešením přes dispatcher obrovský pokrok :-).


Moc vám děkuji za ty odkazy na grafická makra, rozhodně je projdu. Kdybych dokázal udělat to co umí Inkscape se zjednodušováním křivky, bylo by to super :-). Těch algoritmů na zjednodušování křivek už jsem vygůglil několik a fakt nevím, který by stál za to programovat do Basicu, nehledě na to, že z matematického zápisu to přeprogramovat pro mě nějak reálné není, neb tu matiku neumím ani přečíst. A přeci jen je potřeba něco vychytanějšího na zjedodušování spíše různých oblouků než hranatého.
Inkscape zjednodušuje jednotlivé křivky výborně, ale když se to dá najednou na všechny křivky (např. Ctrl+A a Zjednodušit), tak je to viditelně zdeformuje. Napadlo mě i udělat na to zjednodušování křivek po jedné doplněk v Inkscape, ale píší tam že to chce znát nejlépe c++ ale stačí prý i python nebo perl. Z c++ mě před lety bolela hlava a to fakt hodně, do toho nejdu, a python ani perl neumím. Toho pythonu bych se ani nebál, ale beztak by to byla práce alespoň na rok než bych se zase v něčem jinym naučil, to raději budu dělat dál v Libre, neboť v těch už alespoň něco naprogramovat umím a umožňují toho mnohem mnohem víc, co by Inkscape stejně neuměl :-).

Offline

#4 9. 1. 2019 08:08:03

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

Re: Draw: makro pro operace s křivkami Sloučit/Odečíst/Průnik [VYŘEŠENO]

Myslím že je to spíš dobrá shoda okolností. Nyní se připravují pro verzi LO 6.2 konverze ze starých formátů, takže ta kolegyně Regina Henschel na tom možná přímo pracuje. Já jsem mezi tím zjistil, že v červenci 2018 byly aktualizovány nápovědy ve formátu CSV. Například je možné vycházet ze souborů LCOV - code coverage report (rok 2015) ale už to nemusí platit v uvedeném rozsahu. Spíš je vhodnější držet se nejnovějších příkazů (implementací). Jako například zde Příkazy UNO (CSV)
     Je to celkem přes 1700 příkazů poplatných pro různé moduly. Odkaz od Reginy Henschel obsahuje přibližně 700 příkazů - ale jen pro modul Draw a zřejmě jen UNO. Pokud tedy máte zájem o více příkazů doporučuji stáhnout stránku jako textový soubor a uložit pro načtení Calcem. Může to zajímat více uživatelů - proto popíšu detailněji ověřený postup (i když existují i jiné podobné možnosti):
1. stáhnout stránku (například na plochu) ale uložit jako textový soubor.
2. Otveřít nový sešit Calc.
3. Volba LIST > LIST ZE SOUBORU... > VYBRAT help_uno-commands.csv at master · LibreOffice_help · GitHub.txt.
4. Volba filtru - doporučuji filtr UTF-8, podmnožina angličtina UK (USA), separátor TAB (nic jiného)
5. Jakmile potvrdíte vloží se nový list.
6. Bez meškání smažte sloupec "A" (jsou v něm nepotřebné položky jako odkazy a podobně).
7. Nyní bychom měli být v políčku A1 (původní sloupec "B"). Podržíme Shift+Ctrl+šipka dolů.
8. Je vybrán prázdný úsek A1:A144. V A144 je jeden příkaz o který nechceme přijít, proto podržíme poze Shift+šipka nahoru. Zůstane vybrán úsek A1:A143 který smažeme jako řádky. Následně máme v A1 položku .uno:AVMediaPlayer.
9. Stiskneme Ctrl+šipka dolu. Jsme na konci a máme vybránu položku service:com.sun.star.deployment.ui.PackageManagerDialog, kterou doporučuji spíš smazat. Je to sice odkaz na modul, ten ale budeme hledat jen vzácně.
     Zůstane nám 1701 jednotlivých záznamů ve sloupci A. Tyto mají formát nikoliv CSV, ale JSON. Raději si to ukážeme :
.uno:AVMediaPlayer
.uno:About
.uno:AbsoluteRecord
.uno:AcceptChanges
.uno:AcceptTrackedChanges
.uno:ActionMode
.uno:ActiveHelp
.........
.uno:ZoomPrevious
.uno:ZoomToolBox
.uno:convert_to_contour

     Nyní bych doporučil pomocí dialogu NAJÍT A NAHRADIT změnit dvojtečku za tečku jednoduchou, nebo podtržítko. Tím dostáváme syntax pro Basic. Je to ale na úvaze protože když naopak změníme jednu dvojtečku za dvě dvojtečky bude hledání směrováno více na moduly OpenOffice například UNO Automotion OpenOffice, nebo Global index Apache OpenOffice a podobně. V odkázaných stránkách je vidět proč hledat dvojitou dvojtečku, nebo podtržítko, jednoduchou tečku, nebo také třeba lomítko místo dvojtečky.
     Problém má několik rozměrů. Prakticky je lepší hledat jednoduchou tečku, nebo podtržítko. Tyto znaky vedou vetšinou na různá fóra kde najdeme kompletnější, nebo rozmanitější možnosti. Problém je v tom, že k příkazu je nutné zadat ještě parametry. Právě toto nevyčteme z ukázkových příkazů.
     Cesty jsou dvě základní. Buď hledat v oficiálních nápovědách, nebo na fórech. Oficiální nápovědy většinou odkazují právě na moduly OpenOffice, které jsou specifické dvojnásobnou dvojtečkou (stejně tak pro LO), ale LO už nemusí úplně akceptovat stejné příkazy pro AOO. Právě to co LO akceptuje je vhodnější hledat na zdrojích LO - tak jak udělala Regina Henschel. Zde se ale jedná zřejmě (z kódu to nepoznám) pouze o UNO.
     StarBasic má ekvivalenty bez UNO, ale těch je více ve fórech AOO (jednoduchá tečka, podtržítko). Nemusí ale fungovat v LO. Právě hledání ve fórech je vhodnější pro začátečníky. Prvou možností > hledání v modulech je spíš pro pokročilé programátory. Jde sice jen o rutinu - dopracovat se z příkazu na definice parametrů, ale není to moc přehledné. Druhou možností je hledat spíš přímo na fórech kde se už parametry objevují - bez nich nejde nic řešit.


     Pro LO se stále častě prosazuje scriptování v jiných jazycích (tak jak popisuje kamlan). Já osobně se takto "odvracím" na JavaScript který má v LO také Debugger "Rhino". Zde právě existuje možnost používat JSON (JavaScript Object Notation). Ale já to používám trošku jinak, nežli je čistá implementace.
     JSON lze naimplementovat do LO a ten jde následně používat stejně jako UNO - i když na rozdíl od UNO je potřebné (vhodnější, výhodnější) volat odkazované knihovny jQuery, Ajax a podobně. To je ale výstup přímo do HTML, který se musí dík JSON zkrotit pro užití ve Writer. Pro dotaz je zajímavá knihovna Canavas.
     Tento postup se dá srovnat také s používáním asistenčních programů které voláme pomocí Shell příkazů. Například volání Gimp a Inkskape :

Sub Start_Gimp
Shell("C:\Program Files\GIMP-2.2\bin\gimp-2.2.exe")
End Sub

Sub Start_Inkscape
Shell("C:\Program Files\Inkscape\inkscape.exe")
End Sub

     Takže možností jak pracovat nejen s grafikou je více. Faktem je, že je nejlepší mít vše přímo v instalaci tak aby to chodilo i bez síťových, nebo externích knihoven. UNO není nejrychlejší, ale na druhou stranu je to asi nejužitečnější a nejperspektivnější možnost ve smyslu "životnosti".
     Danny Brewer používá reálná makra pro Basic i UNO - tedy včetně parametrů a tím má jeho stará práce stále aktuální přidanou hodnotu. Dá se z toho dobře vycházet i bez znalostí jiného programovacího jazyka.

Editoval neutr (9. 1. 2019 08:35:49)


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

Zápatí