Upcoming Games

No games to display

Full list
Add a game

Upcoming Events

No events to display

Force join

You are here: Home > Forum > Wishlist > Features wish list > Force join

Page 2 of 2

Force join 07/06/2014 at 08:43 #61415
Steamer
Avatar
3997 posts
Online
maxand said:
I didn't think it was possible to create an entirely new train (with a specific length and other attributes) while playing a TT. Is this what you meant, or did you simply mean adjust the length of an existing train?
You can create a new train at any time using the timetable editor. As long as the entry time is set to later than the current simulation time the train will enter in the current session.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Last edited: 07/06/2014 at 08:48 by Steamer
Log in to reply
The following user said thank you: maxand
Force join 07/06/2014 at 09:06 #61416
postal
Avatar
5269 posts
Online
" said:
Steamer wrote:
Quote:
It's possible by creating a train of length x metres (where x is the length you want to add) and editing the timetable of the existing train such that they join.
I didn't think it was possible to create an entirely new train (with a specific length and other attributes) while playing a TT. Is this what you meant, or did you simply mean adjust the length of an existing train?
Creating a train is not a problem (although it means using the TT editor which some people see as a challenge). The problem is that you have to get the new train into the sim somewhere. You can't just parachute a train into a location in mid sim so you have to find somewhere in the sim that is designated as an entry point - there are quite often sidings or depots near a station where you can make a train enter. To get a new train into the sim, you have to use the "New" button in the TT editor (F4 pop-up) and create a TT for the train. If you don't put any times into the new TT, leaving everything as 00:00 the train will enter as the clock ticks over to the next minute after the TT has been created and OK'd.

Just my personal opinion but it all seems an awful lot of hard work just to "cheat" your way out of a problem in a way that couldn't be used in real life.

“In life, there is always someone out there, who won’t like you, for whatever reason, don’t let the insecurities in their lives affect yours.” – Rashida Rowe
Log in to reply
The following user said thank you: maxand
Force join 07/06/2014 at 12:43 #61426
maxand
Avatar
1637 posts
I thought readers might be interested in how I eventually resolved the original impasse. No cheating involved.

The TT was (you guessed it) Exeter Summer Sunday 1980. The Train List showed 0Z45, 0Z74 and 0Z91-3 all cozily sharing the same track circuit at Newton Abbot Platform 3 like three bugs in a rug. Trouble was, I had no idea what sequence they were in.

The Train List read:

0Z45 Up Waiting for joining train 0Z91-3
0Z74 Up Waiting for right-away
0Z91-3 Dn Waiting for joining train 0Z45


First, I slowed the sim down to nearly half speed. Then I tried reversing each train's direction to see what prevented it from moving and studying what the Train List fed back to me, such as "train xxxx in front".

Up till now, I'd hardly bothered reading the Power and Description columns in the Train List as they take up too much space and, anyway, I am usually in too much of a hurry; In fact, I usually cover them up by narrowing the window. However, just as I was about to reverse 0Z91-3, I noticed its Power entry read "None", so that told me something. (If I'd tried reversing it it probably would have displayed "No loco".)

I drew three empty boxes alongside each other on a piece of paper and finally figured out that the order was, from left (Down) to right (Up):

0Z91-3 : 0Z74 : 0Z45

Well, if 0Z91-3 can't be moved and 0Z74 is stuck in the middle, that only left 0Z45 to be shunted out of the way somewhere to give 0Z74 a chance to escape. As JamesN so perceptively expressed it early in this thread:

Quote:
Train A is signalled into platform, scheduled to join train B. You then signal train C into the platform, preventing train A from ever being able to see train B. Then to compound the situation instead of holding train B outside the station to allow C to depart, you go and shove that into the platform as well?

Right.

If you're unwilling to shunt the trains around to correct your mistake, then I propose editing the timetable of train C and train B (this is how to Force join).
Fortunately, both Up and Down lines at Newton Abbot are signalled sufficiently in both directions, permitting me to shunt 0Z45 onto the Down line temporarily without requiring any further prestidigitation, though I abandoned the timetable while doing this (don't know if it's always necessary but it removes another source of interference).

After 0Z74 departed Up, reversing 0Z45's route and pointing it Down resulted in a successful join with 0Z91-3.

Agreed, if I'd studied the timetables of each train ahead more carefully in the first place this might not have happened. I'll have to pay more attention to the Power column from now on. Thanks again to all who helped me here.

Last edited: 07/06/2014 at 12:50 by maxand
Log in to reply
Force join 07/06/2014 at 13:02 #61427
Steamer
Avatar
3997 posts
Online
" said:
Fortunately, both Up and Down lines at Newton Abbot are signalled sufficiently in both directions, permitting me to shunt 0Z45 onto the Down line temporarily without requiring any further prestidigitation, though I abandoned the timetable while doing this (don't know if it's always necessary but it removes another source of interference).
If you're shunting outside a platform you should either abandon TT or edit it to add the appropriate locations to get it to go where you want it to.

Quote:
Agreed, if I'd studied the timetables of each train ahead more carefully in the first place this might not have happened
The correct sequence is that the front loco comes off 0Z91-3, as 0Z74. This heads off to Exeter at 19:45, leaving the way clear for 0Z45 to enter from Heathfield and couple up. The resulting train, 0Z91-4, then departs at 20:00.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Last edited: 07/06/2014 at 14:02 by Steamer
Log in to reply
The following user said thank you: maxand
Force join 07/06/2014 at 14:35 #61428
peterb
Avatar
452 posts
" said:
I am usually in too much of a hurry
Why? Where's the need to be hurrying? I'd suggest you're probably trying to do too much and/or too fast. Running before you can walk?

" said:
if I'd studied the timetables of each train ahead more carefully in the first place this might not have happened.
This. I can see here that a little bit of forward planning from yourself would have prevented 0Z74 getting in the way of the shunt move. Usually this means slowing down or pausing the sim.

The power/description columns are useful but in this case I wouldn't normally have cause to refer to them if everything was going as timetabled.

Also, while your original suggestion of a 'force join' feature may be plausible, despite the logistics of it, I don't see how it would actually have helped you here. Forcing two trains to join together which shouldn't actually be joined together will only cause you more issues!

Log in to reply
Force join 08/06/2014 at 09:19 #61440
maxand
Avatar
1637 posts
peterb wrote:
Quote:
Why? Where's the need to be hurrying? I'd suggest you're probably trying to do too much and/or too fast. Running before you can walk?
No, only trying to do the work of three people (Panels A, B and C, not to mention Crediton).

Quote:
Also, while your original suggestion of a 'force join' feature may be plausible, despite the logistics of it, I don't see how it would actually have helped you here. Forcing two trains to join together which shouldn't actually be joined together will only cause you more issues!
You obviously didn't read my earlier posts well enough. I was trying to join 0Z45 and 0Z91-3, as intended by their timetables.

Last edited: 08/06/2014 at 09:34 by maxand
Log in to reply
Force join 08/06/2014 at 10:03 #61444
Steamer
Avatar
3997 posts
Online
" said:


Quote:
Also, while your original suggestion of a 'force join' feature may be plausible, despite the logistics of it, I don't see how it would actually have helped you here. Forcing two trains to join together which shouldn't actually be joined together will only cause you more issues!
You obviously didn't read my earlier posts well enough. I was trying to join 0Z45 and 0Z91-3, as intended by their timetables.
Peterb's right. You had 0Z74 stuck in the middle, with the two trains attempting to join surrounding it. Force joining in that instance would result in the three locos joining, with nothing working 0Z74's timetable.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Log in to reply
Force join 08/06/2014 at 10:10 #61446
Steamer
Avatar
3997 posts
Online
" said:
peterb said:
Also, while your original suggestion of a 'force join' feature may be plausible, despite the logistics of it, I don't see how it would actually have helped you here. Forcing two trains to join together which shouldn't actually be joined together will only cause you more issues!
You obviously didn't read my earlier posts well enough. I was trying to join 0Z45 and 0Z91-3, as intended by their timetables.
Peter's right. You had 0Z74 trapped in between 0Z45 and 0ZZ93-1. Force-joining would result in all three locos being joined together, which isn't supposed to happen. Further TT editing would be needed to split a loco off to form 0Z74.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Log in to reply
Force join 08/06/2014 at 13:03 #61450
maxand
Avatar
1637 posts
Steamer wrote:
Quote:
Peter's right. You had 0Z74 trapped in between 0Z45 and 0ZZ93-1. Force-joining would result in all three locos being joined together, which isn't supposed to happen.
Since force-joining hasn't even been accepted by the developers, let alone implemented, you can't make any predictions like that! Besides which, 0ZZ93-1 isn't a loco, it's a loco-less consist waiting to be joined by 0Z45.

Anyway, if you recall my original post, my proposed solution included a window with fields for headcodes of the two trains to be joined plus one window for the headcode of the new service. This would prevent more than two trains being joined. Of course, if it became necessary to join three trains into one, this step could be repeated.

The window should also make clear what the sequence of joining is, e.g., if loco B joins consist A, will the product, train C, have the loco at the Up end or the Down end? Radio buttons (alternative choices) marked Facing Up and Facing Down might be the solution here.

Last edited: 08/06/2014 at 13:12 by maxand
Log in to reply
Force join 08/06/2014 at 13:12 #61451
Steamer
Avatar
3997 posts
Online
Quote:
Besides which, 0ZZ93-1 isn't a loco, it's a loco-less consist waiting to be joined by 0Z45.
Looking at the description, it's a dead steam loco, but that's besides the point.

Quote:

The window should also make clear what the sequence of joining is, e.g., if loco B joins consist A, will the product, train C, have the loco at the Up end or the Down end?
Doesn't really matter as SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train.

EDIT: Just re-read the thread, I forgot that the original suggestion was to force a join between two trains that were anywhere on the simulation.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Last edited: 08/06/2014 at 13:31 by Steamer
Log in to reply
Force join 08/06/2014 at 13:36 #61453
maxand
Avatar
1637 posts
Quote:
You can't join two trains that aren't next to each other!
Anything's possible in software! But putting that aside, there are obviously two situations here. One is to force two contiguous trains (next to each other) to join when all other means (near/far exact, etc.) seem to have failed; the other is to force two non-contiguous trains, such as 0Z45 and 0ZZ93-1, to join, even if there happens to be a third train between them. Admittedly this is introducing the Hand of God yet again, but She's always been ready and willing in the past.

If for some reason a join between two trains that should take place cannot be made because joiner and joinee are blocked by other trains and there is no other way out, then a feature that permits joining of non-contiguous trains might be a godsend, so to speak. The only alternative I can think of, barring intricate TT editing, is Remove train. As an example, if Train A is parked waiting for Train B to arrive, but the sim is running late and Train B is miles away, then a non-contiguous join would be equivalent to "moving" Train B from its current location to join Train A, which can then move on, much to the relief of its passengers.

However, I think it would be more realistic and fairer all round to make this "emergency join" feature available only if Train A and Train B are contiguous, and to pop up an error message explaining why not if there happens to be one or more trains between them. This might alert the user to the presence of a third train and to devise some other approach to overcome this problem.

EDIT: Steamer edited his post while I was posting.

Last edited: 08/06/2014 at 13:37 by maxand
Log in to reply
Force join 08/06/2014 at 14:23 #61457
Noisynoel
Avatar
989 posts
" said:
the other is to force two non-contiguous trains, such as 0Z45 and 0ZZ93-1, to join, even if there happens to be a third train between them. Admittedly this is introducing the Hand of God yet again, but She's always been ready and willing in the past..
Jesus! My job would be so much easier if I could just join two trains at work by running rough shod over the one in the middle! Anyway I refer you to the line at the end of each of your posts.. "If SimSig is intended as a serious simulation, why do we save our position as a Game?" Firstly as this IS a simulation then there would be no way that you would join those two trains with another in between! Secondly, if you had read the timetables accordingly, you would never be in this situation and thirdly as you had failed to read the timetables and got yourself in a mess then surly a couple of quick shunts, or swapping 0Z45 & 0Z74 is a) the most realistic and b) probably the quickest way to resolve the issue.

Noisynoel
Log in to reply
The following users said thank you: DriverCurran, andyb0607, y10g9
Force join 08/06/2014 at 14:37 #61458
Hooverman
Avatar
306 posts
It would be interesting to see how a force join would work, if it was used to force two or more trains of what would be incompatible rolling stock in real life?
Log in to reply
Force join 08/06/2014 at 16:16 #61460
postal
Avatar
5269 posts
Online
" said:
Doesn't really matter as SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train
Semantically correct but may give the wrong impression. If you use the Drop Coaches or Detach Engine activities that splits the train into one powered section and one unpowered section. Admittedly not recognising locos and coaches as discrete items, but recognising a proxy for this by having one section with power and one without.

“In life, there is always someone out there, who won’t like you, for whatever reason, don’t let the insecurities in their lives affect yours.” – Rashida Rowe
Log in to reply
Force join 08/06/2014 at 16:29 #61463
jc92
Avatar
3701 posts
" said:
" said:
Doesn't really matter as SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train
Semantically correct but may give the wrong impression. If you use the Drop Coaches or Detach Engine activities that splits the train into one powered section and one unpowered section. Admittedly not recognising locos and coaches as discrete items, but recognising a proxy for this by having one section with power and one without.
an additional point to raise, should it be detach Vehicles rear, given that not all trains in SimSig are formed of coaching stock?

"We don't stop camborne wednesdays"
Log in to reply
Force join 08/06/2014 at 18:39 #61465
peterb
Avatar
452 posts
Max, with all due respect I think you need to still need to learn when to stop fighting your corner, as well as when it is no longer appropriate to make an argument.

" said:
I think there is merit to these suggestions. I've raised them in our bug-tracking system (number 10948). The details of the UI can be worked out if and when we implement them.
" said:
Since force-joining hasn't even been accepted by the developers
In writing this post you obviously forgot what your saw Clive write earlier. That said, the bulk of your post was in essence repeating what we'd all read before in your OP. Since gaining Clive's post which appeared really to resolve the thread and initial idea, you've gone on to argue with myself, Steamer, and others, for why I have no idea, since there's really no need. This isn't the first thread which you've dragged on needlessly. Also, I note the provocative tone of your posts; this too isn't going to help anyone take your ideas seriously despite how credible they might be.

I don't think you're willing to accept that you made a mistake in trapping 0Z74 between two other trains and, actually, your original proposal, as credible as it is would not help you out here. Nevertheless you made a good impression in your original idea, I don't see now why you're trying to loose respect again. There's nothing wrong in admitting some forward planning on your part would have helped, but it's ignorant to stubbornly suggest otherwise.

I'd also like to remind you that other timetables and indeed other simulations are available which might be better suited to you. I can't help but think sticking with Exeter and not trying anything else can't be good for you.

Log in to reply
Force join 09/06/2014 at 15:05 #61480
Finger
Avatar
220 posts
" said:
" said:
Doesn't really matter as SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train
Semantically correct but may give the wrong impression. If you use the Drop Coaches or Detach Engine activities that splits the train into one powered section and one unpowered section. Admittedly not recognising locos and coaches as discrete items, but recognising a proxy for this by having one section with power and one without.

Actually, the original statement is as correct as you can get and your hand-wringing makes the impression it makes even wronger. Basically, Simsig does recognise trains having distinct power types. But it always gets the power type from the timetable, and never recognises "sections" of whatever type as being on the train. So in effect, DCR/DCF are only syntactic sugar that could be as well represented as DR/DF with correct setting of the (initial) power types of the respective trains (DEF/DER too, but these are trickier as they apply changes to the current train).

To conclude, SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train. It doesn't matter what type of carriages are there on the train, which direction the loco is facing or whether the length is in fact sensible.

Log in to reply
Force join 09/06/2014 at 15:58 #61484
postal
Avatar
5269 posts
Online
" said:
" said:
" said:
Doesn't really matter as SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train
Semantically correct but may give the wrong impression. If you use the Drop Coaches or Detach Engine activities that splits the train into one powered section and one unpowered section. Admittedly not recognising locos and coaches as discrete items, but recognising a proxy for this by having one section with power and one without.

Actually, the original statement is as correct as you can get and your hand-wringing makes the impression it makes even wronger. Basically, Simsig does recognise trains having distinct power types. But it always gets the power type from the timetable, and never recognises "sections" of whatever type as being on the train. So in effect, DCR/DCF are only syntactic sugar that could be as well represented as DR/DF with correct setting of the (initial) power types of the respective trains (DEF/DER too, but these are trickier as they apply changes to the current train).

To conclude, SimSig doesn't recognise locos and coaches as discrete items, just 'lengths' of train. It doesn't matter what type of carriages are there on the train, which direction the loco is facing or whether the length is in fact sensible.
Despite your absolute certainty that you are correct, I think we are going to have to agree to differ on this one. I've just run a small test TT for Exeter where a train of 2 x 158 comes out of Riverside Yard and splits at St. Davids. The front portion is TT'd to run forward to St. Thomas and the rear portion is TT'd to go back to Riverside Yard. Using the Drop Coaches at Rear activity, even though the second train is shown as diesel-powered in the TT, F2 shows the status as No Engine and the power type as None after the split. The train does not return to Riverside Yard as it has no power.

Copies of the TT and saved game after the split are attached.

Unless you can point me to an error in the TT or save, I can only make the point again that "If you use the Drop Coaches or Detach Engine activities that splits the train into one powered section and one unpowered section".

Post has attachments. Log in to view them.
“In life, there is always someone out there, who won’t like you, for whatever reason, don’t let the insecurities in their lives affect yours.” – Rashida Rowe
Log in to reply
Force join 09/06/2014 at 16:57 #61486
Steamer
Avatar
3997 posts
Online
To clarify my original comment:

Max said: "The window should also make clear what the sequence of joining is, e.g., if loco B joins consist A, will the product, train C, have the loco at the Up end or the Down end?"

I was making the point that since SimSig doesn't 'see' locos as such, this wasn't necessary. This was in the context of a join, where at least one portion would be powered, therefore the resulting train would be powered.

Divides are a different story, as Postal has explained, and SimSig does indeed simulate powered and non-powered consists.

I hope that clears everything up.

"Don't stress/ relax/ let life roll off your backs./ Except for death and paying taxes/ everything in life.../ is only for now." (Avenue Q)
Last edited: 09/06/2014 at 16:57 by Steamer
Log in to reply
Force join 10/06/2014 at 12:34 #61517
Finger
Avatar
220 posts
Quote:
I think we are going to have to agree to differ on this one

This would be a sad outcome of a discussion over such easy topic.
Quote:
I've just run a small test TT for Exeter ... Using the Drop Coaches at Rear activity, even though the second train is shown as diesel-powered in the TT, F2 shows the status as No Engine

Yes, but isn't the DCR part of a timetable?

This is actually what I was saying - the power type was determined from the timetable. Simsig didn't have any clue about what actually was on the back of the train; it just looks to the timetable and acts accordingly. It will happily let you detach a loco from the other end of the train (even if in fact there isn't any) - this will happen if you mange to send a train into a platform the wrong way. It will let you create two powered trains from a train that had only one loco. However, I have to admit it won't let you eg. conjure a pantograph on a diesel only train, as it is checking the available power types. Unfortunately, there isn't a way to drop just some of the power types on the train, the new train always gets all or nothing (in case of the "carriages part" when dropping carriages/detaching loco).

The attached timetables show how you can achieve similar effect to yours just with DF and power type adjustments.

Post has attachments. Log in to view them.
Last edited: 10/06/2014 at 12:37 by Finger
Log in to reply
Force join 10/06/2014 at 14:55 #61518
postal
Avatar
5269 posts
Online
" said:
Quote:
I think we are going to have to agree to differ on this one

This would be a sad outcome of a discussion over such easy topic.
Quote:
I've just run a small test TT for Exeter ... Using the Drop Coaches at Rear activity, even though the second train is shown as diesel-powered in the TT, F2 shows the status as No Engine

Yes, but isn't the DCR part of a timetable?

This is actually what I was saying - the power type was determined from the timetable. Simsig didn't have any clue about what actually was on the back of the train; it just looks to the timetable and acts accordingly. It will happily let you detach a loco from the other end of the train (even if in fact there isn't any) - this will happen if you mange to send a train into a platform the wrong way. It will let you create two powered trains from a train that had only one loco. However, I have to admit it won't let you eg. conjure a pantograph on a diesel only train, as it is checking the available power types. Unfortunately, there isn't a way to drop just some of the power types on the train, the new train always gets all or nothing (in case of the "carriages part" when dropping carriages/detaching loco).

The attached timetables show how you can achieve similar effect to yours just with DF and power type adjustments.
We are now getting towards some clarity with the benefit of a little shifting of emphasis. The blanket statement you made a couple of posts ago ("it always gets the power type from the timetable"is now modified to "it always gets the power type from the timetable depending on which TT I decide to use - the one for the divided portion or the one for the train dropping off the divided portion". The second train in my Exeter example has a TT with a Diesel power type. We now see that your original statement excludes that TT in preference to the TT of the train dropping off the section. If you had made that distinction in the first place, then we would have had this clarity rather earlier.

I hope this helps towards clearing things up without recourse to an unnecessarily aggressive or impolite tone or attitude.

“In life, there is always someone out there, who won’t like you, for whatever reason, don’t let the insecurities in their lives affect yours.” – Rashida Rowe
Last edited: 10/06/2014 at 14:56 by postal
Log in to reply
Force join 10/06/2014 at 16:09 #61522
clive
Avatar
2799 posts
" said:
Quote:
You can't join two trains that aren't next to each other!
Anything's possible in software!
To make it clear, I would not expect Geoff or I to implement anything other than joining adjacent trains.

Log in to reply
Force join 10/06/2014 at 16:35 #61524
clive
Avatar
2799 posts
Okay, let me explain what actually goes on inside the core code.

A "train" is a monolithic entity. It has three significant properties as far as this discussion is concerned: its length, its available traction, and its current traction. The core code doesn't know about "coaches" or "locos" or anything like that, just these three properties. When a train enters the simulation, these three values are taken from its timetable (if it doesn't have a timetable, they're set to a default length and diesel only). When simulations are chained, the length is instead taken from the other simulation.

When a train carries out a "next" activity, then the current traction is set to those types found in both the train's available traction and the new timetable's initial traction; a "next" doesn't alter the available traction and can't add traction types not found there.

When two trains join, the lengths are added and the two traction properties are each combined. That is, if a train with available traction 3rd and 4th rail, current traction 3rd rail, joins a train with available traction diesel and 4th rail, current traction diesel, the joined train will have available traction diesel, 3rd, and 4th rail and current traction diesel and 3rd rail. A "next" can be used to change the latter (and one day I may get round to adding a new "change traction" activity).

When two trains divide, then the new part gets the length in its timetable and the old part gets the rest. Traction is more complex:

  • The new part is set as follows:
    [ul]
    [li]For a "drop", the available and current traction are set to "none".

  • For a "detach" or a simple divide, the available traction is set to that of the original train and the current traction is set to those values found in both the original train's available traction and the new timetable's initial traction.


[/li]
  • The old part is set as follows:

      [li]For a "detach", the available and current traction are set to "none".
    • For a "drop" or a simple divide, the available and current traction are left unaltered.


    [/li]
    [/ul]

    Hopefully this will stop the arguments.
    Log in to reply
    The following user said thank you: Finger
  • Force join 10/06/2014 at 16:44 #61525
    kbarber
    Avatar
    1764 posts
    " said:
    " said:
    Quote:
    You can't join two trains that aren't next to each other!
    Anything's possible in software!
    To make it clear, I would not expect Geoff or I to implement anything other than joining adjacent trains.

    Until the people who were working on the bionic duckweed
  • get round to antigravity...

    Sorry, I'll get my coat on the way out :lol:

  • One of Roger Ford's memorable themes when D(a)fT insisted in calling what was obviously going to be a diesel "self-powered" and wouldn't allow anyone to call it a diesel.

  • Log in to reply