position is not a valid member of Part? - exception
i have the code below, it should be working as coping a part called "boulder"(unanchored), and moving it to the desired position, but instead:"position is not a valid member of Part"
while true do
wait(2)
local original = workspace.boulder
-- Create the model copy
local copy = original:Clone()
-- Parent the copy to the same parent as the original
copy.Parent = original.Parent
-- Move the copy so it's not overlapping the original
copy.position = CFrame.new(-84.76, 206.227, 143.094) -- where error happens
Debris:AddItem(copy, 2)
end
The problem you seem to be having is because Position is supposed to have a capital P.
Fix:
while true do
wait(2)
local original = workspace.boulder
-- Create the model copy
local copy = original:Clone()
-- Parent the copy to the same parent as the original
copy.Parent = original.Parent
-- Move the copy so it's not overlapping the original
copy.Position = CFrame.new(-84.76, 206.227, 143.094) -- Position Capitalised correctly
Debris:AddItem(copy, 2)
end
Related
Extracting color from complex function: " Cannot modify global variable 'cColor' in function."
I'd like to extract the "col" color value from this function to be used to paint plots or candle colors. But everything I try creates one error or another. I checked the Script Reference. Shouldn't there be some way to "return" a value, as is usually the case with most functions? lset(l,x1,y1,x2,y2,col)=> line.set_xy1(l,x1,y1) line.set_xy2(l,x2,y2) line.set_width(l,5) line.set_style(l, line.style_solid) line.set_color(l,y2 > y1 ? #ff1100 : #39ff14) //red : green temp = line.get_price(l,bar_index) // another value to extract
The documentation is showing it like this: line.new(x1, y1, x2, y2, xloc, extend, color, style, width) → series line So in your code it's looking differently and also the "new" is missing. Scrolling a bit up on the linked page shows that there exist indeed methods to retrieve some properties of the line object: Lines are managed using built-in functions in the line namespace. They include: line.new() to create them. line.set_*() functions to modify the properties of an line. line.get_*() functions to read the properties of an existing line. line.copy() to clone them. line.delete() to delete them. The line.all array which always contains the IDs of all the visible lines on the chart. The array’s size will depend on the maximum line count for your script and how many of those you have drawn. aray.size(line.all) will return the array’s size. The most simple usage is to instantiate a line object with the correct values directly, like shown here: //#version=5 indicator("Price path projection", "PPP", true, max_lines_count = 100) qtyOfLinesInput = input.int(10, minval = 1) y2Increment = (close - open) / qtyOfLinesInput // Starting point of the fan in y. lineY1 = math.avg(close[1], open[1]) // Loop creating the fan of lines on each bar. for i = 0 to qtyOfLinesInput // End point in y if line stopped at current bar. lineY2 = open + (y2Increment * i) // Extrapolate necessary y position to the next bar because we extend lines one bar in the future. lineY2 := lineY2 + (lineY2 - lineY1) lineColor = lineY2 > lineY1 ? color.lime : color.fuchsia line.new(bar_index - 1, lineY1, bar_index + 1, lineY2, color = lineColor) Getting the line color from outside is difficult or impossible though as there never exists a method to retrieve it while for other properties those methods exist. So the most simple way is to create the same funcionality, to get the color that exists inside the line-object, outside too, or only outside. currentLineColor = y2 > y1 ? #ff1100 : #39ff14 You could try to extend the line-object somehow like this: line.prototype.get_color = function() { return this.color; }; console.log(line.get_color()) I'm not sure if the approach with the prototype is working but it's worth it to try if you need it.
Update planned order - two committed modifications, only one saved
I need to update two information on one object: the quantity (PLAF-gsmng) and refresh the planned order via the module function 'MD_SET_ACTION_PLAF'. I successfully find a way to update each data separately. But when I execute the both solutions the second modification is not saved on the database. Do you know how I can change the quantity & set the action on PLAF (Planned order) table ? Do you know other module function to update only the quantity ? Maybe a parameter missing ? It's like if the second object is locked (sm12 empty, no sy-subrc = locked) ... and the modification is not committed. I tried to: change the order of the algorithm (refresh and after, change PLAF) add, remove, move the COMMIT WORK & COMMIT WORK AND WAIT add DEQUEUE_ALL or DEQUEUE_EMPLAFE This is the current code: 1) Read the data lv_plannedorder = '00000000001' "Read PLAF data SELECT SINGLE * FROM PLAF INTO ls_plaf WHERE plnum = lv_plannedorder. 2) Update Quantity data " Standard configuration for FM MD_PLANNED_ORDER_CHANGE CLEAR ls_610. ls_610-nodia = 'X'. " No dialog display ls_610-bapco = space. " BAPI type. Do not use mode 2 -> Action PLAF-MDACC will be autmatically set up to APCH by the FM ls_610-bapix = 'X'. " Run BAPI ls_610-unlox = 'X'. " Update PLAF " Customize values MOVE p_gsmng TO ls_plaf-gsmng. " Change quantity value MOVE sy-datlo TO ls_plaf-mdacd. " Change by/datetime, because ls_610-bapco <> 2. MOVE sy-uzeit TO ls_plaf-mdact. CALL FUNCTION 'MD_PLANNED_ORDER_CHANGE' EXPORTING ecm61o = ls_610 eplaf = ls_plaf EXCEPTIONS locked = 1 locking_error = 2 OTHERS = 3. " Already committed on the module function " sy-subrc = 0 If I go on the PLAF table, I can see that the quantity is edited. It's working :) 3) Refresh BOM & change Action (MDACC) and others fields CLEAR ls_imdcd. ls_imdcd-pafxl = 'X'. CALL FUNCTION 'MD_SET_ACTION_PLAF' EXPORTING iplnum = lv_plannedorder iaccto = 'BOME' iaenkz = 'X' imdcd = ls_imdcd EXCEPTIONS illegal_interface = 1 system_failure = 2 error_message = 3 OTHERS = 4. IF sy-subrc = 0. COMMIT WORK. ENDIF. If I go on the table, no modification (only the modif. of the part 2. can be found on it). Any idea ? Maybe because the ls_610-bapco = space ?
It should be possible to update planned order quantity with MD_SET_ACTION_PLAF too, at least SAP Help tells us so. Why don't you use it like that? Its call for changing the quantity should possibly look like this: DATA: lt_acct LIKE TABLE OF MDACCTO, ls_acct LIKE LINE OF lt_acct. ls_acct-accto = 'BOME'. APPEND lt_acct. ls_acct-accto = 'CPOD'. APPEND lt_acct. is_mdcd-GSMNG = 'value' "updated quantity value CALL FUNCTION 'MD_SET_ACTION_PLAF' EXPORTING iplnum = iv_plnum iaenkz = 'X' IVBKZ = 'X' imdcd = is_mdcd "filled with your BOME-related data + new quantity TABLES TMDACCTO = lt_accto EXCEPTIONS illegal_interface = 1 system_failure = 2 error_message = 3. So there is no more need for separate call of MD_PLANNED_ORDER_CHANGE anymore and no more problems with update. I used word possibly because I didn't find any example of this FM call in the Web (and SAP docu is quite ambiguous), so I propose this solution just as is, without verification. P.S. Possible actions are listed in T46AS table, and possible impact of imdcd fields on order can be checked in MDAC transaction. It is somewhat GUI equivalent of this FM for single order.
Compare index of 2 elements in a collection
Issue : I have some issues figuring out a way to select elements in my HTMLDocument which are under a certain point in the page. In the following code sample, as you can see in the comments, I first select a part of them which respect my queryselector criteria IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") In this example I have 10 elements in this collection. Each of this element in contained in a table which is its parent on the 7th degree. MsgBox TypeName(IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(2).ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode) ' HTMLTable Some of those elements are in the same table. You can see here the form which contains all the tables . Now, the thing is that I want to select the innerHTML of some of those elements only and not all of them. The criterion to know if I one of those 10 elements interests me or not is it's position on the webpage. I want all the elements which are under the message Part Usage. There is only one table containing the Part Usage text and so my idea was to see if the table in which are contained each element has a higher or lower index in the "form" collection. If the index is higher I want this element, otherwise I discard it. What I did for this is the following code : I set the ID Bim to all the tables containing one or more from the 10 elements. For Each Element In IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' here for all of the 10 numbers found with the queryselectorall we'll find their respective table in the collection (form) and set its Class as "Bim". But since some of the numbers are in the same table, we won't have 10 tables with a classname "Bim" at the end of the process. We'll have only x tables with the classname "Bim" Element.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.Class = "Bim" Next I set the ID Stop to the table containing the text Part Usage For Each Element In IEDoc.getElementsByClassName("SectionHead") If Element.innerHTML = "Part Usage" Then 'MsgBox TypeName(Element.ParentNode.ParentNode.ParentNode)' HTMLTable Element.ParentNode.ParentNode.ParentNode.ID = "Stop" End If Next I check which tables with the Classname Bim are under (=higher index) the table with the ID Stop. For the table ( there is actually only one) matching the criterion of point 3 I apply IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") inside of them so that I get all the elements in contains and more paricularly their innerHTML. For Each Element In IEDoc.getElementsByClassName("Bim") ' Here we check all the x tables which have the Classname "Bim" If Element.indexInTheWholeForm > IEDoc.getElementById("Stop").indexInTheWholeForm Then 'and compare somehow if their index in the (form) collection if higher than the table with the ID "Stop" ( this is similar to checking if the element if lower on the webpage in thic case) ( we only want the element which have a higher index aka under the Part Usage table) For Each Element2 In Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' Now we are in the table which contains the part numbers and we'll look for all the part numbers it contains by applying the queryselectorall again, but this time only in this specific table array_parts2(iteration2) = Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(iteration2).innerHTML ActiveWorkbook.Worksheets(1).Cells(iteration2 + 1, 19) = array_parts2(iteration2) iteration2 = iteration2 + 1 Next End If Next of course what doesn't work is the indexInTheWholeForm property which doesn't exist. Any ideas on how to do this ? Thank for reaching that line :)
Untested but I would do something like this (assuming I understood you correctly) Sub Tester() Const S_MATCH As String = "td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']" Dim e, tbl, bHit As Boolean '... 'load page etc '... 'get all the matching rows and cycle though them For Each e In IEDoc.querySelectorAll(S_MATCH) 'did we get to the table of interest yet? If Not bHit Then Set tbl = e.ParentNode.ParentNode.ParentNode.ParentNode. _ ParentNode.ParentNode.ParentNode If IsPartUsageTable(tbl) Then bHit = True End If If bHit Then 'we reached the table of interest, so ' do something with e End If Next End Sub Function IsPartUsageTable(tbl) As Boolean Dim e, rv As Boolean For Each e In tbl.getElementsByClassName("SectionHead") If Element.innerHTML = "Part Usage" Then rv = True Exit For End If Next IsPartUsageTable = rv End Function
Ok, so as unexpected as it sounds, I think I found a solution to my own question. I will confirm you that it works as soon as I have the possibility to run it with my colleague. So I keep point 1 and 2 from my initial post and I replaced point 3 with the following : For i = 0 To IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table").length If IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).ID = "Stop" Then index_Part_Usage = i Position_Part_Usage = index + 1 Exit For End If Next 'MsgBox Position_Part_Usage For i = 0 To IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table").length If IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).className = "Bim" Then index = i Position = index + 1 If index > index_Part_Usage Then For Each Element2 In IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' Now we are in the table which contains the part numbers and we'll look for all the part numbers it contains by applying the queryselectorall again, but this time only in this specific table array_parts2(iteration2) = IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(iteration2).innerHTML ActiveWorkbook.Worksheets(1).Cells(iteration2 + 1, 19) = array_parts2(iteration2) iteration2 = iteration2 + 1 Next End If End If Next i
DBGrid - OnCellClick & OnDblClick, return a form/TBMemo containing cell/column value/s
I'm using the following code added to my DBGrid - OnCellClick event procedure TForm2.DBGrid1CellClick(Column: TColumn); begin if dbmodule.comenziDataSet.Active then begin if not Assigned(dbgridCelulaForm) then begin dbgridCelulaForm := TdbgridCelulaForm.Create(Self); dbgridCelulaForm.DBMemoCelula.DataSource := dbmodule.comenziSource; end; dbgridCelulaForm.Visible := False; dbgridCelulaForm.Visible := True; dbgridCelulaForm.DBMemoCelula.DataField := Column.FieldName; dbgridCelulaForm.Caption := Format('%s / randul: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]); end; end; dbgridCelulaForm = name of the form containing the TDBMemo DBMemoCelula = name of the TDBMemo dbmodule.comenziDataSet = comenziDataSet is the name of the DataSet and dbmodule is the name of a data module (unit, like forms) - the DataSet is on the data module, so, dbmodule.comenziDataSet dbmodule.comenziSource = same as data set, a DataSource on a data module, the source is named comenziSource Ok so what this code does: Once I click a cell on my DBGrid it pops up a form (named dbgridCelulaForm) which contains a TBMemo (named DBMemoCelula) and it shows me the information contained in that cell (like, a Customer Name for example, or whatever the cell is holding, in my db) This is fine, my problem is I can't select rows now in DBGrid, well, I can but once I do the 1st place I click (a cell, any) on the particular row I want to select with my mouse, then cell activates and the form pops up. Is it possible to use this code in DBGrid - OnDblClick event instead of the OnCellClick ? Meaning once i double click a row / cell the form should pop up and show me the info, but double click - not single click. That way, I can still select the row and still view the info in the cell if I need to. Or any other way/place to use/receive this functionality. Any thoughts? I can post a quick video of everything if my explanation is ambiguous and you think that would help, just tell me in the comment / answer. Also, I'm using RAD Studio 10 Seattle and dbexpress components for the database - if that helps. Thanks!
The following code shows how to access the Column and Row coordinates of a dbl-clicked cell of a TDBGrid, and the string value of the cell contents. As written, it displays the cell's Column and Row number + string contents on the form's caption. Up to you what you actually do with these values. It work because the dataset cursor on the dataset connected to the DBGrid is moved to the dataset row corresponding to the cell where the mouse pointer is. type TMyDBGrid = class(TDBGrid); procedure TForm1.DBGrid1DblClick(Sender: TObject); var ARow, ACol : Integer; Pt : TPoint; CellValue : String; begin // First, get the mouse pointer coordinates Pt.X := Mouse.CursorPos.X; Pt.Y := Mouse.CursorPos.Y; // Translate them into the coordinate system of the DBGrid Pt := DBGrid1.ScreenToClient(Pt); // Use TDBGrids inbuilt functionality to identify the Column and // row number. ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X -1; ARow := DBGrid1.MouseCoord(Pt.X, Pt.Y).Y; CellValue := DBGrid1.Columns[ACol].Field.AsString; Caption := Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]); end; Note that I've used the Caption property of the form to display the grid cell info just as a quick n dirty way of showing the information somewhere. Of course you could equally well display it on another area of the form or somewhere on a different form entirely. The above code will work equally well in the grid's OnCellClick event, btw. As noted in a comment, you can use the grid's SelectedField property instead of the above, but personally I think the above is more instructive of how to work with a DBGrid, because it shows how to get the cell's Column and Row coordinates. See the DBGrid's SelectedField, SelectedIndex and SelectedRows properties in the Online Help for more info on useful properties of the TDBGrid. Update You asked in a comment for an example of showing the information on another form. Let's suppose this form is called OtherForm, is in a unit OtherFormu.Pas and is created before the DBGrid1DblClick evenbt is called. You need to use this unit in the Useslist of the unit which contains the DBGrid. Let's suppose this other form contains a TMemo control called Memo1. Then, you could write your DBGrid1DblClick hanndler like this: procedure TForm1.DBGrid1DblClick(Sender: TObject); [as above] begin [ as above ] CellValue := DBGrid1.Columns[ACol].Field.AsString; OtherForm.Memo1.Lines.Add(Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue])); end;
Scilab - calling another GUI within a GUI. Functions not working
I'm quite new to scilab, I have created two GUIs (see example below), with script 2 being called from script 1. However the function in script 2 don't seem to work. Can anyone help? Script 1 '////////// f=figure('figure_position',[0,0],'figure_size',[1250,650]); ////////// delmenu(f.figure_id,gettext('File')) delmenu(f.figure_id,gettext('?')) delmenu(f.figure_id,gettext('Tools')) toolbar(f.figure_id,'off') handles.dummy = 0 ; handles.exam=uicontrol(f,'unit','normalized','BackgroundColor', [0.5,1,1],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[14],'FontUnits','points','FontWeight','bold','ForegroundColor',[0,0.5,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.5,0.5,0.1,0.05],'Relief','flat','SliderStep',[0.01,0.1],'String','exam','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','obj102','Callback','exam_callback(handles)') function exam_callback(handles) close(f); clear exec('costs0-1.sce',-1) ; endfunction` Script 2 ////////// Defining the figure (size, name etc)///////////////////////////// f=figure('figure_position',[0,0],'figure_size',[1250,650],'auto_resize','on','background',[8]); ////////// delmenu(f.figure_id,gettext('File')) delmenu(f.figure_id,gettext('?')) delmenu(f.figure_id,gettext('Tools')) toolbar(f.figure_id,'off') //Cabinet - TEXT handles.obj17=uicontrol(f,'unit','normalized','BackgroundColor',[1,1,1],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[0,0,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.15,0.93,0.1,0.05],'Relief','flat','SliderStep',[0.01,0.1],'String','Cabinet','Style','text','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','obj17','Callback','') // Cabinet - POP UP MENU handles.service=uicontrol(f,'unit','normalized','BackgroundColor',[0.8,0.8,0.8],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[12],'FontUnits','points','FontWeight','normal','ForegroundColor',[0,0.5,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.25,0.93,0.15,0.05],'Relief','flat','SliderStep',[0.01,0.1],'String','1|2','Style','popupmenu','Value',[1],'VerticalAlignment','middle','Visible','on','Tag','service','Callback','service_callback(handles)') // CALCULATE PUSHBUTTON handles.Calculate=uicontrol(f,'unit','normalized','BackgroundColor',[0,0.8,0],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[16],'FontUnits','points','FontWeight','bold','ForegroundColor',[0,0,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.22,0.02,0.15,0.08],'Relief','raised','SliderStep',[0.01,0.1],'String','CALCULATE','Style','pushbutton','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','Calculate','Callback','Calculate_callback(handles)') // Resources- TEXT handles.Resourcestxt=uicontrol(f,'unit','normalized','BackgroundColor',[1,1,1],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[14],'FontUnits','points','FontWeight','bold','ForegroundColor',[0,0.5,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.75,0.95,0.20,0.05],'SliderStep',[0.01,0.1],'String','Resources in hours','Style','text','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','','Callback','') // TOTAL hours - TEXT handles.totalhourstxt=uicontrol(f,'unit','normalized','BackgroundColor',[1,1,1],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[14],'FontUnits','points','FontWeight','bold','ForegroundColor',[0,0.5,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.75,0.75,0.12,0.05],'SliderStep',[0.01,0.1],'String','Total Hours','Style','text','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','','Callback','') // hardware hours - text handles.totalhours=uicontrol(f,'unit','normalized','BackgroundColor',[0.95,1,1],'Enable','on','FontAngle','normal','FontName','helvetica','FontSize',[14],'FontUnits','points','FontWeight','bold','ForegroundColor',[0,0.5,0],'HorizontalAlignment','center','ListboxTop',[],'Max',[1],'Min',[0],'Position',[0.88,0.75,0.08,0.05],'SliderStep',[0.01,0.1],'String','','Style','text','Value',[0],'VerticalAlignment','middle','Visible','on','Tag','totalhours','Callback','') function Calculate_callback(handles) if handles.service.value == 1 then resource_hrs = 2 end if handles.service.value == 2 then resource_hrs = 10 end set(handles.totalhours,'String',string(resource_hrs)); endfunction
Problem It is a scoping problem. When function exam_callback() gets called it runs the other script with exec('costs0-1.sce',-1). In that script you define the function Calculate_callback(handles). This goes out of scope and is deleted when exam_callback() is finished and as such can't be called when the button is pressed. The second problem is that the handles are not globally affected, so when leaving exam_callback() the handles of the second Cost Gui are not added to handles. Solution You can move the generating of the GUI into a function createCostGui() and then load script2 at the start of script1 with exec('costs0-1.sce',-1);. To make Calculate_callback(handles) function discard the handles argument and use the tags to find the handles function Calculate_callback() serviceHandle = findobj('tag','service'); if serviceHandle.value == 1 then resource_hrs = 2 end if serviceHandle.value == 2 then resource_hrs = 10 end totalHoursHandle = findobj('tag','totalhours'); set(totalHoursHandle,'String',string(resource_hrs)); endfunction Further remarks Text elements are generally static and thus don't need a Callback argument. If you want an argument to stay at its default value, you don't need to specify them. From the Scilab documentation: h = uicontrol(PropertyName, PropertyValue,...) creates an uicontrol and assigns the specified properties and values to it. It assigns the default values to any properties you do not specify. The default uicontrol style is a "Pushbutton". The default parent is the current figure. See the Properties section for information about these and other properties. Small remark on your question Next time an error message could help with making your question more specific.