JanKoehnlein / FXDiagram

JavaFX diagram
Apache License 2.0
74 stars 21 forks source link

Unable to run examples #53

Closed digitig closed 7 years ago

digitig commented 7 years ago

I've followed the instructions to install FXDiagram on Eclipse Mars.2 Release (4.5.2). I've installed the example project, but if I try to run it I get the following errors:

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [bundleresource://560.fwk2055019335:1/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [bundleresource://560.fwk2055019335:2/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder] !SESSION 2016-11-16 20:45:33.237 ----------------------------------------------- eclipse.buildId=4.5.2.M20160212-1500 java.version=1.8.0_101 java.vendor=Oracle Corporation BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB Framework arguments: -product org.eclipse.platform.ide Command-line arguments: -product org.eclipse.platform.ide -data D:\Users\Tim\workspace/../runtime-EclipseApplication -dev file:D:/Users/Tim/workspace/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/dev.properties -os win32 -ws win32 -arch x86_64 -consoleLog

!ENTRY org.eclipse.egit.ui 2 0 2016-11-16 20:45:39.452 !MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git user global configuration and to define the default location to store repositories: 'C:\Users\Tim'. If this is not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and EGit might behave differently since they see different configuration options. This warning can be switched off on the Team > Git > Confirmations and Warnings preference page.

!ENTRY org.eclipse.oomph.setup.ui 2 0 2016-11-16 20:45:40.623 !MESSAGE java.lang.NullPointerException !STACK 0 java.lang.NullPointerException at org.eclipse.oomph.setup.ui.SetupUIPlugin.performStartup(SetupUIPlugin.java:445) at org.eclipse.oomph.setup.ui.SetupUIPlugin.access$5(SetupUIPlugin.java:416) at org.eclipse.oomph.setup.ui.SetupUIPlugin$1$1.run(SetupUIPlugin.java:253) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

JanKoehnlein commented 7 years ago

None of these error log messages are directly from FXDiagram, and I suppose it should work despite these.

Could you elaborate what you did and what exactly does not work?

JanKoehnlein commented 7 years ago

Did you use Oomph or install it directly via the P2 update site?

pahjbo commented 7 years ago

I too cannot run the examples - I installed from the P2 update site on eclipse neon.3 - I do not see any obvious error messages. However, as I first try to use the context menu on the DSL to open an FX Diagram I can see the menu item, but then selecting it does nothing and subsequently the "FX Diagram" menu idem does not appear in the context menu.

JanKoehnlein commented 7 years ago

The context menu item pops up in the first context menu you open, then may disappear or get greyed out when you're in the context menu of something that has no diagram element associated. So it is not enough to be e.g. in the context menu of a domain model file, but you have to have it opened and select a package or entity declaration in order to get the diagram.

pahjbo commented 7 years ago

Hi - I have run up the development environment, and now I can see the problem with the examples

May 12, 2017 5:32:31 PM de.fxdiagram.mapping.XDiagramConfig$Registry lambda$0 SEVERE: Plug-in "de.fxdiagram.eclipse.ecore" was unable to instantiate class "de.fxdiagram.eclipse.ecore.EcoreDiagramConfig". May 12, 2017 5:32:31 PM de.fxdiagram.mapping.XDiagramConfig$Registry lambda$0 SEVERE: Plug-in "de.fxdiagram.eclipse.pde" was unable to instantiate class "de.fxdiagram.pde.BundleDiagramConfig". 0 [main] ERROR org.eclipse.xtext.service.CompoundModule - Type org.eclipse.xtext.xbase.file.AbstractFileSystemSupport not present java.lang.TypeNotPresentException: Type org.eclipse.xtext.xbase.file.AbstractFileSystemSupport not present at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) at sun.reflect.generics.reflectiveObjects.WildcardTypeImpl.getUpperBounds(WildcardTypeImpl.java:130) at org.eclipse.xtext.service.MethodBasedModule.getFirstTypeParameter(MethodBasedModule.java:108) at org.eclipse.xtext.service.MethodBasedModule.getKeyType(MethodBasedModule.java:99) at org.eclipse.xtext.service.MethodBasedModule.configure(MethodBasedModule.java:48) at org.eclipse.xtext.service.CompoundModule.configure(CompoundModule.java:35) at org.eclipse.xtext.service.AbstractGenericModule.configure(AbstractGenericModule.java:33) at org.eclipse.xtext.service.DefaultRuntimeModule.configure(DefaultRuntimeModule.java:76) at org.eclipse.xtext.example.domainmodel.AbstractDomainmodelRuntimeModule.configure(AbstractDomainmodelRuntimeModule.java:24) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) at com.google.inject.spi.Elements.getElements(Elements.java:101) at com.google.inject.spi.Elements.getElements(Elements.java:92) at com.google.inject.util.Modules$RealOverriddenModuleBuilder$1.configure(Modules.java:152) at com.google.inject.AbstractModule.configure(AbstractModule.java:59) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) at com.google.inject.spi.Elements.getElements(Elements.java:101) at com.google.inject.spi.Elements.getElements(Elements.java:92) at com.google.inject.util.Modules$RealOverriddenModuleBuilder$1.configure(Modules.java:152) at com.google.inject.AbstractModule.configure(AbstractModule.java:59) at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223) at com.google.inject.spi.Elements.getElements(Elements.java:101) at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103) at com.google.inject.Guice.createInjector(Guice.java:95) at com.google.inject.Guice.createInjector(Guice.java:72) at com.google.inject.Guice.createInjector(Guice.java:62) at org.eclipse.xtext.example.domainmodel.ui.internal.DomainmodelActivator.createInjector(DomainmodelActivator.java:67) at org.eclipse.xtext.example.domainmodel.ui.internal.DomainmodelActivator.getInjector(DomainmodelActivator.java:55) at org.eclipse.xtext.example.domainmodel.ui.DomainmodelExecutableExtensionFactory.getInjector(DomainmodelExecutableExtensionFactory.java:26) at org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory.create(AbstractGuiceAwareExecutableExtensionFactory.java:51) at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:262) at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) at de.fxdiagram.mapping.XDiagramConfig$Registry.lambda$0(XDiagramConfig.java:64) at java.lang.Iterable.forEach(Iterable.java:75) at de.fxdiagram.mapping.XDiagramConfig$Registry.addStaticConfigurations(XDiagramConfig.java:79) at de.fxdiagram.mapping.XDiagramConfig$Registry.<init>(XDiagramConfig.java:52) at de.fxdiagram.mapping.XDiagramConfig$Registry.getInstance(XDiagramConfig.java:44) at de.fxdiagram.eclipse.commands.ShowInDiagramContribution.addMenuItemsForEntryCalls(ShowInDiagramContribution.java:81) at de.fxdiagram.eclipse.commands.ShowInDiagramContribution$1.accept(ShowInDiagramContribution.java:62) at de.fxdiagram.eclipse.xtext.XtextSelectionExtractor.lambda$0(XtextSelectionExtractor.java:34) at org.eclipse.xtext.resource.OutdatedStateManager.exec(OutdatedStateManager.java:91) at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.internalReadOnly(XtextDocument.java:520) at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.readOnly(XtextDocument.java:492) at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:133) at de.fxdiagram.eclipse.xtext.XtextSelectionExtractor.addSelectedElement(XtextSelectionExtractor.java:38) at de.fxdiagram.eclipse.commands.ShowInDiagramContribution.lambda$0(ShowInDiagramContribution.java:67) at java.util.ArrayList.forEach(ArrayList.java:1249) at de.fxdiagram.eclipse.commands.ShowInDiagramContribution.getContributionItems(ShowInDiagramContribution.java:69) at org.eclipse.ui.actions.CompoundContributionItem.getContributionItemsToFill(CompoundContributionItem.java:86) at org.eclipse.ui.actions.CompoundContributionItem.fill(CompoundContributionItem.java:59) at org.eclipse.ui.internal.menus.DynamicMenuContributionItem.fill(DynamicMenuContributionItem.java:147) at org.eclipse.jface.action.MenuManager.doItemFill(MenuManager.java:728) at org.eclipse.jface.action.MenuManager.update(MenuManager.java:810) at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:472) at org.eclipse.jface.action.MenuManager.access$1(MenuManager.java:465) at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:497) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:256) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4256) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1501) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1524) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1505) at org.eclipse.swt.widgets.Menu.menuWillOpen(Menu.java:805) at org.eclipse.swt.widgets.Display.windowProc(Display.java:5787) at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method) at org.eclipse.swt.internal.cocoa.NSMenu.popUpContextMenu(NSMenu.java:77) at org.eclipse.swt.widgets.Menu._setVisible(Menu.java:267) at org.eclipse.swt.widgets.Display.runPopups(Display.java:4157) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3699) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519) at org.eclipse.equinox.launcher.Main.main(Main.java:1492) Caused by: java.lang.ClassNotFoundException: org.eclipse.xtext.xbase.file.AbstractFileSystemSupport cannot be found by org.eclipse.xtext.example.domainmodel_2.8.4.201508041756 at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ... 92 more

JanKoehnlein commented 7 years ago

That looks like a version conflict with the Xtext/Xbase examples. You could work around this by importing the domainmodel example into the dev workspace using File > New... > Example > Xtext > Xtext Domain-Model Example.

Please also pull the latest changes.

pahjbo commented 7 years ago

I have managed to get the examples running in the development environment - the steps that I took were

  1. pull latest changes
  2. make sure that I was using XText 2.10 (rather than the now default 2.11) - this might prove not to be necessary though - but I think that the fowlerdsl example might not be bundled with the 2.11 version.
  3. use -Dorg.osgi.framework.bundle.parent=ext -Dosgi.framework.extensions=org.eclipse.fx.osgi as VM arguments to make sure that the JavaFX swt extensions were loaded properly
  4. add the org.eclipse.xtext.example.fowlerdsl and org.eclipse.xtext.example.fowlerdsl.ui bundles as required for the de.fxdiagram.xtext.fowlerdsl fragment
pahjbo commented 7 years ago

not sure if I should really start a new topic, but it is essentially related to this - in that after creating my own plugin - it too behaves in the same way when loaded into an eclipse instance created with the oomph installer - The real sticking point is loading the JavaFX classes - and this can be solved by editing the eclipse.ini and adding -Dorg.osgi.framework.bundle.parent=ext -Dosgi.framework.extensions=org.eclipse.fx.osgi as above. This "solution" was discovered by sifting through a lot of confusing advice found as a result of googling - is there not a better solution to this issue? I do not really want to have to tell my users that they need to edit the eclipse.ini to use the plug-in....

pahjbo commented 7 years ago

I have found a workable solution to the problem of JavaFX being loaded properly and automatically by only loading my FXDiagram based plug-in. The e(fx)clipse project does supply a feature to workaround this problem org.eclipse.fx.runtime.min.feature which can be added as an "included feature" in the feature description of my plug-in.

JanKoehnlein commented 7 years ago

Thank you for sorting this out.

To run FXDiagram in Eclipse, you need the jfxswt.jar shipped with your JDK on the classpath, which is troublesome in OSGi. This is why we use the minimum runtime feature of e(fx)clipse. It should work by just putting the org.eclipse.fx.runtime.min.feature in the target platform, but from my experience it is safer to also explicitly trigger its execution by adding -Dorg.osgi.framework.bundle.parent=ext -Dosgi.framework.extensions=org.eclipse.fx.osgi to the eclipse.ini. So if in doubt, do both.

The issue with the non-resolvable examples results from the fact that these examples are shipped with Xtext to be instantiated using a wizard, but there is no pre-built update site for them beyond version 2.8. Unfortunately, there has been a breaking change in Xtext 2.9. I have to think about a way to ship the examples as part of the FXDiagram update site.

suprithwork commented 7 years ago

Hi pahjbo, I have tried a similar approach, but I am unable to resolve this issue. Can you help me sort this out.

pahjbo commented 7 years ago

the previous few comments provide the answers to what the underlying problems were and the solutions - my "best" solution for my own plug-in was to add the minimum e(fx)clipse runtime as an included feature - see https://github.com/pahjbo/vodsl/blob/master/net.ivoa.vodml.sdk/feature.xml

JanKoehnlein commented 7 years ago

I've added the examples to the update-site, so you should now be able to just install FXDiagram and the Eclipse examples directly into your Eclipse. I tested it with a new, bare Eclipse for Eclipse Committers with Java 1.8.0_111 on Mac and it worked out of the box. No more compilation, domainmodel/fowlerdsl plug-in instantiation, start of a new runtime Eclipse necessary, just import the project with the example models into your workspace as described on the website and have fun.

digitig commented 6 years ago

I'm unable to work out how to run the FxExample - partly because I can't work out what it's supposed to do. If I run the example, I get messages in the console, apparently from MrsGrantsSecretCompartments, but no diagram. Is there any more documentation anywhere?

lilyflower1 commented 5 years ago

Hi, I am trying running the state-machine example from FXDiagram-Examples.zip and I have issues with it. In the Eclipse Application it is working perfectly but in the runtime application, I get the following error : !ENTRY org.eclipse.ui 4 0 2019-06-25 11:35:22.323 !MESSAGE Unhandled event loop exception !STACK 0 java.lang.NoClassDefFoundError: javafx/embed/swt/FXCanvas at de.fxdiagram.eclipse.FXDiagramView.createNewTab(FXDiagramView.java:144) at de.fxdiagram.eclipse.commands.NewDiagramHandler.execute(NewDiagramHandler.java:18) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:291) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:92) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:305) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:239) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132) at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210) at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:431) at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.handleWidgetSelection(AbstractContributionItem.java:446) at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.lambda$2(AbstractContributionItem.java:472) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5268) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1348) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4522) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4107) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:151) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) at org.eclipse.equinox.launcher.Main.run(Main.java:1499) at org.eclipse.equinox.launcher.Main.main(Main.java:1472) Caused by: java.lang.ClassNotFoundException: javafx.embed.swt.FXCanvas cannot be found by de.fxdiagram.eclipse_0.36.1.qualifier at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:484) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:395) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:387) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:150) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 46 more Could you help me with it ? Thanks

JanKoehnlein commented 5 years ago

The runtime application should not use SWT controls, like de.fxdiagram.eclipse.FXDiagramView.

Ah, you mean the runtime Eclipse. Looks like there is a problem with efxclipse. I am sorry, but I currently don't have the time to dig into this.

lilyflower1 commented 5 years ago

Ok well at least it is working properly in Eclipse workspace. I would like to write my own configuration with your plugin because I have a DSL-based metamodel with Xtext but it is actually 3 DSL-based metamodels that are working together. I am not sure if your plugin actually support that kind of configuration because with your examples there were only one domainmodel. Do you know if it is possible or not ?

JanKoehnlein commented 5 years ago

I am still not sure: Do you want to create an Eclipse plug-in or a standalone Java application for your DSL? Multiple metamodels should not be a problem in either scenario.

lilyflower1 commented 5 years ago

I would like to create an Eclipse plug-in. I assume I have to edit the fragment.xml of the diagram config project. But I am not sure about what I should add to map with my 3 meta models. Sorry for the burden, I am not very familiar with it. Thanks for your help