Create a new file from within a script

Use this forum to ask questions about how to do things in QCAD.

Moderator: andrew

Forum rules

Always indicate your operating system and QCAD version.

Attach drawing files and screenshots.

Post one question per topic.

Post Reply
tukuyomi
Full Member
Posts: 50
Joined: Mon Aug 09, 2010 6:15 pm

Create a new file from within a script

Post by tukuyomi » Thu Apr 28, 2016 9:45 am

Hi all!
I have to write a script that creates 2 drawings on different files.

I tried to

Code: Select all

include("scripts/File/NewFile.js")
but I don't understand how to use it.
I tried various things found on the doc and this forums, but for the life of me, I can't see any "Untitled 2" window :oops:

Can anyone please help me on this? Just create a new Window as if you clicked on the New File button and draw a few lines on it from a script?

Code: Select all

include("scripts/File/NewFile.js")
Something.prototype.beginEvent = function() {
//Stuff
var newFile = new NewFile();
//How to get DocumentInterface, a view, etc?
//How to start drawings entities
Thank you for your support

Edit : Typo

User avatar
andrew
Site Admin
Posts: 9019
Joined: Fri Mar 30, 2007 6:07 am

Re: Create a new file from within a script

Post by andrew » Thu Apr 28, 2016 10:04 am

The easiest way to do exactly the same as File > New, is to manually trigger File > New:
var fileNewAction = RGuiAction.getByScriptFile("scripts/File/NewFile/NewFile.js");
if (!isNull(fileNewAction)) {
    fileNewAction.slotTrigger();
}

tukuyomi
Full Member
Posts: 50
Joined: Mon Aug 09, 2010 6:15 pm

Re: Create a new file from within a script

Post by tukuyomi » Thu Apr 28, 2016 11:39 am

Hi Andrew, thanks for the reply!

I managed to get a new file by doing this :

Code: Select all

  var _f = new NewFile();
  _f.beginEvent();
//Error on next line
  var _d = _f.getDocument();
  var _di = _f.getDocumentInterface();
Note that the third line produces a warning:

Code: Select all

Warning:  RAction::getDocument: Action has no document.
Anything I'm doing wrong? (note that I don't have a clue of what I'm doing here, I go by trials and errors :D)
Thanks for your time in helping me.

User avatar
andrew
Site Admin
Posts: 9019
Joined: Fri Mar 30, 2007 6:07 am

Re: Create a new file from within a script

Post by andrew » Thu Apr 28, 2016 11:59 am

There are actions which run in the context of a document (i.e. require a document), for example all drawing or modification tools.
Other actions run in a global context and do not require a document (such as File > New).

Actions which run in a global context do not reference a document (there might not even be any documents open at all).

You can get the current document from any context using EAction.getDocument() which returns undefined if no documents are open.

tukuyomi
Full Member
Posts: 50
Joined: Mon Aug 09, 2010 6:15 pm

Re: Create a new file from within a script

Post by tukuyomi » Thu Apr 28, 2016 3:00 pm

Thanks again for the reply.
I managed to get it working somehow :
I created a function in my myFunctions.js script on top on my MyScripts tree:

Code: Select all

function NewDrawing() {
  var _f = RGuiAction.getByScriptFile("scripts/File/NewFile/NewFile.js");
  if (!isNull(_f)) { _f.slotTrigger(); }
  return [EAction.getDocument(), EAction.getDocumentInterface(), EAction.getGraphicsView()];
}
As you can see, it returns an array containing important stuff.
So in my scripts, I use

Code: Select all

BlahBlah.prototype.beginEvent() {

  var _a = new NewDrawing(); //returns Array[0=Document, 1=DocumentInterface, 2=GraphicsView]

//Include some drawings

//Call autozoom when drawing is terminated  
  _a[2].autoZoom();

  this.terminate();
}
Surely things can be done better, but It Works For Me™ so I'm happy!

Thanks again :) Cheers!

tukuyomi
Full Member
Posts: 50
Joined: Mon Aug 09, 2010 6:15 pm

Re: Create a new file from within a script

Post by tukuyomi » Sat Apr 30, 2016 11:34 am

I have another small question. Here is my script
include("../MyScripts.js");

function ExSkelton(guiAction) {
  MyScripts.call(this, guiAction);
};

ExSkelton.prototype = new MyScripts();

ExSkelton.prototype.beginEvent = function() {
  MyScripts.prototype.beginEvent.call(this);

  var _f = RGuiAction.getByScriptFile("scripts/File/NewFile/NewFile.js");
  if (!isNull(_f)) { _f.slotTrigger(); }

  this.terminate();
};

ExSkelton.init = function(basePath) {
    var action = new RGuiAction(qsTr("&Skelton"), RMainWindowQt.getMainWindow());
    action.setRequiresDocument(true);
    action.setScriptFile(basePath + "/ExSkelton.js");
    action.setGroupSortOrder(50100);
    action.setSortOrder(100);
    action.setWidgetNames(["MyScriptsMenu"]);
};
The code works OK, I get a new file created. This is good.

But I would like to set

Code: Select all

(line 20) action.setRequiresDocument(false);
When doing this, my code works as well, but I get some warnings on the terminal:
Qcad 3.12.6

Code: Select all

Warning:  RScriptHandlerEcma::eval: script engine exception:  "TypeError: Result of expression 'a.finishEvent' [undefined] is not a function."
Qcad 3.14.2

Code: Select all

Warning:  RScriptHandlerEcma::eval: script engine exception:  "TypeError: Result of expression 'a.destroy' [undefined] is not a function."
Is it all that important?
I only tested my script on Linux so far, but at work, I have Qcad Pro on Windows 10 OS. Will my script work on Windows as well?
Thanks for replying

User avatar
andrew
Site Admin
Posts: 9019
Joined: Fri Mar 30, 2007 6:07 am

Re: Create a new file from within a script

Post by andrew » Mon May 02, 2016 8:37 am

Actions which do not require a document are run in a global script context. Such actions are also implicitly stateless, meaning that there is no user interaction possible and no events are delivered to such actions. For such actions, only beginEvent is called. Once beginEvent is finished executing, the action is always terminated and destroyed automatically. So calling this.terminate() is not necessary for such an action.

tukuyomi
Full Member
Posts: 50
Joined: Mon Aug 09, 2010 6:15 pm

Re: Create a new file from within a script

Post by tukuyomi » Mon May 02, 2016 2:45 pm

Thanks for the reply !

I removed this.terminate(); from my code above, but I still get the warnings.
I guess it does not matter, as the scripts runs fine on Windows and Linux.

Thank you again, Cheers !

Post Reply

Return to “QCAD 'How Do I' Questions”